Commit Graph

623 Commits

Author SHA1 Message Date
Nick Wynja
0e698df8f3 Updates query for threads
Previous query incorrectly pulled and sorted posts, often showing years
old posts from newly followed people. This now behaves more consistently
as "recent threads from people in your extended network".
2020-03-31 10:34:47 -04:00
Tim Robinson
4884a49dfb Pretty-ify code. Remove unnecessary comment 2020-03-31 00:19:58 -07:00
Tim Robinson
8cce580008 Show who liked content on hover
- Adds a hover popup that shows the names of everyone who liked a post
when hovering of the heart.
- Add new call to post.get that retrieves the names of all voters and
returns them instead of their ID's.
2020-03-30 23:53:27 -07:00
Christian Bundy
7e22829578 Fix own profile error
Problem: A `null` relationship represents when it's your profile, which
isn't very intuitive. It causes an error when we try to check for the
`blocking` and `following` properties, which don't exist on `null`.

Solution: Instead of `null`, set a `me` property to tell whether this
relationship is our own profile.
2020-03-28 13:32:02 -07:00
Christian Bundy
e7bd3ed305 Add block and unblock to author profile
Problem: We have a way to follow and unfollow, but there's no way to
block or unblock. Also if you go to the profile of a blocked peer, their
posts still show up.

Solution: Add block and unblock and hide messages from blocked peers on
their profile page.

Fixes: https://github.com/fraction/oasis/issues/370
2020-03-28 10:03:31 -07:00
Sean Billig
0c5116ad0c
Merge branch 'master' into type-defs 2020-03-27 19:10:35 -07:00
Sean Billig
4aa2841247
Merge pull request #339 from christianbundy/add-auto-hops
Automatically connect to replicated peers
2020-03-27 17:20:18 -07:00
wuhei
6d396c16cc typos 2020-03-28 00:04:10 +01:00
Sean Billig
e96486b1d0
Merge pull request #366 from christianbundy/fix-double-channel
Avoid processing popular posts twice
2020-03-27 14:51:02 -07:00
Christian Bundy
4091fce767 Fix linter problems
Problem: This doesn't pass the linter.

Solution: Run `npm run fix` and disable the spell-checker when we
define language names.
2020-03-27 14:14:39 -07:00
wuhei
b27b6241f2 Italian translation, changed a string in the Spanish translation 2020-03-27 19:12:49 +01:00
Sean Billig
288d5f10fa
Merge pull request #341 from christianbundy/root-channel
Don't append channel to non-root posts
2020-03-27 10:46:07 -07:00
Christian Bundy
5b2ae2a219 Avoid processing popular posts twice
Problem: Messages are being fetched with `post.get()`, which runs the
`transform()` function to decorate them with Markdown/etc, but then
they're being passed through `transform()` a second time at the end of
the function. This is inefficient and applies side-effects (like adding
channels to the post) twice.

Solution: Remove the final `transform()` so that these posts are only
decorated once.

Fixes: https://github.com/fraction/oasis/issues/358
2020-03-27 09:43:57 -07:00
Christian Bundy
555249277f Remove @ts-ignore workaround
Problem: The workaround is no longer necessary now that the new version
of @types/koa has been published. Thanks to @peterblazejewicz,
@harryparkdotio, and @orta for the quick upstream fix.

Solution: Run `npm update` and remove the `@ts-ignore` comment.
2020-03-27 09:13:31 -07:00
Christian Bundy
fb23d25217 Add more type definitions to reduce implicit any
Problem: We still have heaps of implicit 'any' types that our linters
can't make sense of.

Solution: Keep on adding type documentation! Slowly but surely I'm
hoping we can reduce the amount of untyped JavaScript in the repo.
2020-03-27 08:21:40 -07:00
Christian Bundy
defb57321e Merge branch 'master' of github.com:fraction/oasis into type-defs 2020-03-27 08:02:44 -07:00
Nick Wynja
bae675f039 Revert selector to span to fix lock alignment 2020-03-27 10:11:11 -04:00
Nick Wynja
8efe326cdf
Merge pull request #357 from christianbundy/consistent-ui
Fix UI inconsistencies
2020-03-27 09:44:47 -04:00
mario siqueira
acba28af67 Prettiered 2020-03-26 18:13:38 -03:00
Mario Siqueira
2c86eb5cf1
fixed the fix
Previous fix did not take into account "unfollow". Now it does
2020-03-26 17:56:10 -03:00
Mario Siqueira
a5ae700b92
fix follow button link for non-english languages
currently if non-english language is set in configuration, the FOLLOW button doesn't work (it takes the i18n translation as part of the URL).
2020-03-26 16:48:16 -03:00
Christian Bundy
43c8310abf Reduce indent border size
Problem: The indent borders take up lots of space and visual attention
when you're in highly-nested threads.

Solution: Reduce their size by half.
2020-03-26 11:22:24 -07:00
Christian Bundy
3e6489db67 Fix CSRF and DNS rebind vulnerabilities
Problem: Since we don't validate the referer hostname or the HTTP host
header, an attacker who can trick an Oasis user into clicking a
malicious link can submit HTTP requests to localhost, potentially
publishing messages or extracting information.

Solution: Ensure that all requests have valid hostnames in the referer
to protect against CSRF attacks, ensure that all requests have valid
hostnames in the HTTP header to protect against DNS rebind attacks, and
ensure that errors are only output in the HTTP response when we're sure
that the request is valid.
2020-03-26 10:13:03 -07:00
Christian Bundy
9ddb23b501 Fix UI inconsistencies
Problem: After some fantastic new pull requests, there are some
inconsistencies between how each author implemented different features.

Solution: Fix regressions and iron out inconsistencies. This fixes the
heart highlight bug, uses the same indentation for Summaries + Threads +
the thread view, tightens up the CSP now that we don't need
unsafe-inline styles, and uses a neutral tone for indents with the same
width as the blockquote border (so far violet has been reserved for
private messages).
2020-03-25 16:03:51 -07:00
Jacob Karlsson
7e1b38394b Fix style 2020-03-25 21:31:23 +01:00
Jacob Karlsson
e8b2a2d163 Merge branch 'master' of github.com:fraction/oasis into hide-forks 2020-03-25 21:24:09 +01:00
Jacob Karlsson
86450d49ce Auto-expand ancestors of the linked post 2020-03-25 21:09:04 +01:00
Jonathan Dahan
9bbf082304
Merge pull request #342 from christianbundy/connected-only
Only show connected peers in settings
2020-03-25 10:01:18 -04:00
Christian Bundy
3f335eedbf
Merge pull request #353 from nickwynja/threads
Introduces Threads
2020-03-25 06:36:54 -07:00
Nick Wynja
95e7a31dcd lint fix 2020-03-25 09:05:53 -04:00
Sean Billig
03a6a143cd
Merge pull request #349 from christianbundy/fix-theme
Fix theme using capitalization
2020-03-24 19:22:47 -07:00
Christian Bundy
4653bdb01f Fall back to TCP socket if Unix connection fails
Problem: We're only attempting connection via Unix sockets, but some SSB
services may choose to only listen on TCP sockets.

Solution: Start by attempting connection to Unix socket and fallback to
the TCP socket remote if that doesn't work, before just trying to start
our own SSB service.
2020-03-24 19:06:23 -07:00
Nick Wynja
48f8108340 Merge master 2020-03-24 21:00:38 -04:00
Nick Wynja
a96aaa5012 Merge conflict 2020-03-24 19:57:22 -04:00
Nick Wynja
3280956d3b Adds sticky section headers
While reading long conversations, it's easy to get a bit lost as to whom
 is saying what. With some basic CSS, we can keep the header of the post
 sticky so you can see more context above the message.
2020-03-24 19:40:12 -04:00
Nick Wynja
fa874e8f4f Fixes spacing issues in text-based browsers
Closes #329; Addresses spacing issues in text-based browsers by introducting block
elements and non-breaking spaces.
2020-03-24 19:40:12 -04:00
Christian Bundy
a4ccae8833 Fix theme using capitalization
Problem: Capitalization in "sulphurPool" was causing a file not found.

Solution: Replace "sulphurPool" with "sulphurpool".
2020-03-24 14:55:50 -07:00
Christian Bundy
11c413d447 Merge branch 'master' of github.com:fraction/oasis into npm-update-march-23 2020-03-24 12:09:39 -07:00
Nick Wynja
a4b00696ab Load theme using existing config mechanisms
This allow someone to pass in the theme as a command line arg or set the
theme in defaults.json, while still allowing someone to set the theme on
a per-browser basis as a cookie.
2020-03-24 14:11:27 -04:00
Christian Bundy
64ab443e27 Only show connected peers in settings
Problem: The peer list shows peers that are connected and in the process
of establishing a new connection, which has lots of turbulence. It's
confusing to see dozens of "connections" that only exist for a few
milliseconds when they're actually just connection attempts.

Solution: Only show peers with the state "connected".
2020-03-24 09:47:45 -07:00
Christian Bundy
f64a512e52
Merge pull request #335 from christianbundy/fix-private-message
Fix crash when linking directly to private message
2020-03-24 09:35:01 -07:00
Christian Bundy
aeebd2d4eb Don't append channel to non-root posts
Problem: When publishing a root post, other clients give you the option
of adding a `channel` property, which is basically just a hashtag. We
show this at the end of the message, but since replies often copy the
`channel` property then it gets appended to every reply.

Solution: Only append the channel as a hashtag for root posts.
2020-03-24 09:26:54 -07:00
Christian Bundy
c9fffe2b9c Add TypeScript definitions for better guardrails
Problem: We have TypeScript enabled on the project but have been missing
lots of definition files, so there are like 500 errors when you enable
`--noImplicitAny`.

Solution: Add definitions and fix the bugs that they point out. This
reduces the number of errors with `--noImplicitAny` to 285.
2020-03-24 09:23:52 -07:00
Christian Bundy
1adbd15afd Don't append channel to non-root posts
Problem: When publishing a root post, other clients give you the option
of adding a `channel` property, which is basically just a hashtag. We
show this at the end of the message, but since replies often copy the
`channel` property then it gets appended to every reply.

Solution: Only append the channel as a hashtag for root posts.
2020-03-24 08:11:13 -07:00
Christian Bundy
42e051fc6a Merge branch 'add-auto-hop' 2020-03-23 19:55:46 -07:00
Christian Bundy
32465e5983 Update npm dependencies
Problem: Our dependencies are falling behind and it'd be nice to have
them up-to-date. The only big update it that Common-Good upgraded to the
latest version of Prettier.

Solution: Update them!
2020-03-23 18:59:53 -07:00
Christian Bundy
01a9ae6347 Automatically connect to replicated peers
Problem: By default we only connect to people that we're directly
following, which often don't have public IP addresses.

Solution: Automatically connect to all available peers within our
replication hops (default 2) to make peering more reliable.
2020-03-23 14:21:38 -07:00
Jacob Karlsson
cbb8ff381c Add previews of forks 2020-03-22 23:43:25 +01:00
Jacob Karlsson
3ed1e3e12f Rename variables with old names 2020-03-22 22:22:35 +01:00
Jacob Karlsson
3439433630 Don't make deep indented messages shrink 2020-03-22 22:14:39 +01:00
Jacob Karlsson
a84d469c7d Remove old way of indenting forks 2020-03-22 22:06:07 +01:00
Jacob Karlsson
66627be257 Simplify repeated logic 2020-03-22 21:48:59 +01:00
Jacob Karlsson
aae34fbfad Remove inner functions by combining them 2020-03-22 21:36:26 +01:00
Jacob Karlsson
3b1bdc9218 Fix off-by-1 error WAOW 2020-03-22 21:20:30 +01:00
Jacob Karlsson
7171732bc0 Remove old commented code 2020-03-22 20:58:27 +01:00
Jacob Karlsson
dba4ec2955 Add basic fork styling 2020-03-22 20:54:48 +01:00
Justin Abrahms
b5d37c7c8d Actually shift cards over, rather than just a minor indent. 2020-03-21 20:09:28 -07:00
Jacob Karlsson
7b05b78e52 Merge remote-tracking branch 'origin/master' into hide-forks 2020-03-21 14:43:37 +01:00
Christian Bundy
bdcc127674 Fix crash when linking directly to private message
Problem: Trying to view a private message crashes the server and leaks a
bunch of memory. That's bad. This problem is caused by faulty handling
in the function that finds thread ancestors. There's some code that says
"if the next ancestor is a private message, just return the ancestors
that we know about", which returns nothing when we're looking up a
private post (because we can't identify *any* ancestors).

Solution: Ensure that we're only resolving the promise once in the
function by chaining `else if`s and ensure that we only return the
ancestor list if there are actually ancestor in it. If the ancestor list
is empty, we can just return the single message that we know about and
pass it off.
2020-03-20 11:33:18 -07:00
Cinnamon
6f3a13d144
Merge pull request #325 from christianbundy/indexing-error-message
Indexing error message
2020-03-17 18:59:08 -07:00
Christian Bundy
122ed68a82 Merge commit 'refs/pull/316/head' of github.com:fraction/oasis 2020-03-17 10:22:22 -07:00
Christian Bundy
e5df3a1497 Rename errorView() to indexingView()
Problem: Since the `errorView()` has a refresh we can probably just call
it `indexingView()` and add the indexing-specific code.

Solution:  Rename `errorView()` to `indexingView()` and add a progress
bar for it.
2020-03-17 07:41:57 -07:00
Christian Bundy
1f050b18a4 Add auto-refreshing error page on indexing error
Problem: The indexing message is being thrown as an error, which is
pasted as plaintext, so we can't do a page refresh. This is frustrating
when you're waiting for the indexes to finish because you have to
manually refresh a bunch while you wait.

Solution: Use the prototype from @justinabrahms to add an HTML message
for the indexing error and automatically refresh the page every ten
seconds.
2020-03-17 07:24:46 -07:00
Justin Abrahms
5c2d536d92 An html error message. 2020-03-16 20:25:43 -07:00
f032cbcc7f
Added reference to "plain text" instead of just text 2020-03-12 19:44:28 +00:00
Nick Wynja
c3a4474256 Merge branch 'master' of https://github.com/fraction/oasis into threads 2020-03-11 23:22:11 -04:00
Cinnamon
dba544c9b5
Merge branch 'master' into add-profile-image-upload 2020-03-11 17:20:47 -07:00
Cinnamon
d2cdef8244
Merge pull request #299 from christianbundy/indexing-error
Present error message while waiting for indexing
2020-03-11 16:03:56 -07:00
4e27dd4b59
Added references to posts from yourself in Topics and Summaries 2020-03-11 21:54:22 +00:00
836c5a06ed
Changed desription to mention that latest also includes posts from yourself 2020-03-11 21:47:40 +00:00
Christian Bundy
2c806af919
Merge pull request #311 from georgeowell/rearrange-settings
Rearrange settings
2020-03-11 07:10:34 -07:00
Christian Bundy
861dc76524
Merge pull request #309 from hng/feature/fix-popular-link
Fix link to popular view in navigation
2020-03-11 07:09:26 -07:00
Christian Bundy
228cab563d
Merge pull request #310 from georgeowell/view-thread-label
View thread label
2020-03-11 07:08:42 -07:00
Henning Schumann
076f5f21c1 Fixed link to popular view in navigation 2020-03-11 11:30:49 +01:00
4232d0f05b
Moved peer connections to the top of settings 2020-03-11 09:26:02 +00:00
850d1d2373
Rearranged settings in order of most likely use 2020-03-11 09:14:14 +00:00
daf82588ab
Tweaked edit your profile description to make it clearer 2020-03-11 08:55:29 +00:00
dc723595b4
Removed reference to "basic post" 2020-03-11 08:52:27 +00:00
e4dd883e2a
Changed reference to message to comment for consistency 2020-03-11 08:51:03 +00:00
Christian Bundy
f3f8e3dda3
Merge pull request #307 from christianbundy/cherry-pick-2
finished spanish i18n
2020-03-10 20:16:50 -07:00
mario
8c3fc3f393 finished spanish i18n 2020-03-10 20:05:56 -07:00
mario
cc4f6caef2 lands on /mentions instead of /public/popular/day 2020-03-10 20:02:00 -07:00
seekr
fc2137381a
fix duplicate search for es 2020-03-10 14:49:47 -03:00
seekr
2117b9f76b
more updates to spanish 2020-03-10 11:31:27 -03:00
seekr
8fbbdaaaf4
started adding spanish translations 2020-03-10 10:01:06 -03:00
Nick Wynja
7e601ae35a Adds Threads view for seeing wider conversation 2020-03-10 08:42:56 -04:00
Christian Bundy
f2cf067b67 Present error message while waiting for indexing
Problem: When our views are still indexing the database they apparently
don't respond over MuxRPC, which means that we're just waiting forever
until they finish. This means that people who are indexing the database
get an HTTP response that might take an hour to finish.

Solution: If we have more than 1 mebibyte of backlog, present an error
message explaining the situation and asking for a bit of patience.
2020-03-09 15:14:28 -07:00
Henning Schumann
15417422a4 Made "private/public" comment translatable 2020-03-09 12:19:01 +01:00
Henning Schumann
314033cdd0 Made content warning text field placeholder translatable 2020-03-09 11:57:21 +01:00
Christian Bundy
a2e7f4ad6d
Merge pull request #293 from hng/feature/translations-de
Add German translations
2020-03-08 17:57:46 -07:00
Henning Schumann
b86eeeb3e5 Finished up German translations :) 2020-03-08 19:26:36 +01:00
Cinnamon
e7c38e3ec5
Merge pull request #285 from christianbundy/vanilla-markdown
Vanilla markdown
2020-03-06 11:57:08 -08:00
Henning Schumann
d035b165fd Even more German translations 2020-03-06 17:17:00 +01:00
Jacob Karlsson
5c1cd759bc Fix bug with missing flatness 2020-03-06 17:00:06 +01:00
Jacob Karlsson
e4a9548cda Add basic hiding of forks 2020-03-06 16:33:31 +01:00
Henning Schumann
d628486ae1 More German translations 2020-03-05 21:22:20 +01:00
Henning Schumann
6aca504921 Merge remote-tracking branch 'upstream/master' into feature/translations-de 2020-03-05 19:53:53 +01:00
3ed7a52d37
Specified "this post" rather than "the post" in /publish 2020-03-04 00:17:06 +00:00
Christian Bundy
cb1cf5e87e Render vanilla Markdown with basic renderer
Problem: The SSB-Markdown library has some SSB-flavored quirks, like
messing with newline behavior, and is inappropriate for rendering plain
Markdown like the readme.

Solution: Since SSB-Markdown uses Markdown-It under the hood, we can use
the same library and just render our Markdown *without* the SSB-flavored
quirks. This gives us the ability to wrap text and avoid SSB-Markdown
problems without having to rewrite all of our Markdown.
2020-03-03 16:13:56 -08:00
d4cb2cf9e9
Changed "warning to "content warning" 2020-03-04 00:11:45 +00:00
47aa7d3efb
Changed references to "messages" in /publish to "posts" 2020-03-04 00:04:20 +00:00
107bee5e52
Added word public for emphasis on /publish 2020-03-04 00:00:00 +00:00
Christian Bundy
2e7cb4ad66 Remove readme and startup focus on configuration
Problem: A big chunk of both the readme and the startup output is
dedicated to configuration, which feels to me to be focused on
developers and advanced users rather than beginners who just want to try
using Oasis.

Solution: Move readme configuration info to its own file and hide all
config output (except one line) behind `--debug`. While doing this I
noticed that we're `require()`ing a few modules that we don't need
before setting `process.env.DEBUG`, which I've reorganized so that we
don't accidentally disable debug mode for those modules.
2020-03-01 11:39:01 -08:00
Christian Bundy
1f6f635935 Remove debugging cruft
Problem: I have debug mode manually enabled and have `console.log()`
calls sprinkled through the code and I'm doing `require("crypto")` too
many times.

Solution: Remove debugging cruft so that we don't have a perma-debug
mode.
2020-03-01 11:19:23 -08:00
Christian Bundy
02d6d5adac Add profile image upload
Problem: We can set our name and profile description but profile images
are expected by most people and supported by most clients and we don't
have them. A profile without an image can sometimes lack the intimacy
you'd get if you let people upload profile images that they can use as a
visual avatar.

Solution: Add profile image upload to the Edit Profile page and add a
bunch of plumbing for `ssb.blobs.add()` to add the blob and publish a
message setting it as a profile image.
2020-03-01 11:11:09 -08:00
Cinnamon
3c1453db33
Merge pull request #270 from christianbundy/fix-extended
Fix Extended page sorting posts incorrectly
2020-02-28 14:53:28 -08:00
Christian Bundy
9d3553352f Show channel as text appended to posts
Problem: Other clients render a `channel` property, which is basically a
way to add a single hashtag to your post, but Oasis doesn't support
that. This means that someone might post "this is fun!" under the
channel #running and people using Oasis would just see "this is fun!"
without any context.

Solution: Add the hashtag to the bottom of the post, which visually
looks the same as someone adding two newlines and a hashtag to the end
of the text in their post.
2020-02-27 17:21:23 -08:00
Christian Bundy
dcd995140b Fix Extended page sorting posts incorrectly
Problem: The Extended page is sorting by received timestamp, not
asserted timestamp.

Solution: Find the `Date.now` and replace it with `Date.now()`, which
refers to the current date instead of `undefined`, which is what you get
if you try to `JSON.stringify(Date.now)`.
2020-02-27 16:53:41 -08:00
Cinnamon
e9fc29c592
Merge branch 'master' into edit-profile 2020-02-27 14:05:37 -08:00
Cinnamon
f9a787bef0
Merge pull request #260 from christianbundy/fix-dta-queries
Fix queries with an unused `{index: "DTA"}` option
2020-02-27 14:02:43 -08:00
Cinnamon
763c9f7672
Merge pull request #262 from christianbundy/existing-oasis
Detect existing Oasis server running on interface
2020-02-27 14:01:21 -08:00
Cinnamon
2e59c0e994
Merge pull request #263 from christianbundy/hide-blocked-search
Hide search results from blocked feeds
2020-02-27 14:00:27 -08:00
Christian Bundy
927026937c Add hashtag support to search
Problem: Searching for a hashtag should bring you to the hashtag page,
and the hashtag page should have some useful information about which
page you're on instead of just showing you the messages.

Solution: Add code so that if you search for a hashtag you're brought to
that page, and display some useful help text at the top of the page
explaining the hashtag page. While ensuring that the hashtag page showed
posts from around the network (instead of only people you're following)
I fixed the popular page so that it has the same behavior again (fixing
a regression) and filtered out gatherings (fixing *another* regression)
on the popular page. These probably should've happened in another commit
but I got carried away. :/

Happy to split this commit into two if it hurts to bundle the popular
fixes with the hashtag fix, but I'm low on energy and want to at least
open a PR in case it doesn't bother anyone.
2020-02-27 12:14:29 -08:00
Christian Bundy
340f2842fa Hide search results from blocked feeds
Problem: The search results weren't hiding results from blocked feeds.

Solution: Add `socialFilter()` to ensure that all blocked feeds are
removed from search results as the first step in the stream processing.
2020-02-26 15:26:40 -08:00
Christian Bundy
ddf57b227f Detect existing Oasis server running on interface
Problem: Sometimes you try to run Oasis twice and the second time you
run the program it blows up in your face about the port being taken.
Most other software just focuses or reopens the window instead of
throwing errors at you.

Solution: Implement `/.well-known/oasis` as a sanity check to see
whether the thing listening on the HTTP port. If it replies "oasis" then
we can open the tab (unless `config.open === false`) and avoid throwing
the error.
2020-02-26 14:11:14 -08:00
Christian Bundy
3686113043 Add profile edit page
Problem: An SSB client should allow you to declare your own name, but
Oasis didn't support that behavior at all.

Solution: Add a basic 'Edit Profile' page that lets you set your name
and description. This doesn't implement profile images because I had
limited time and didn't want to think about encoding formats, but it's
worth mentioning that I remember something about binary uploads with the
default form encoding actually send 3 times as much data because of
escapes or something? This might not effect us because we're on
localhost, but I want to make a note that this isn't implemented yet.

This also makes a small change regarding the `<label>` element --
previously we were writing them as siblings to the input and using the
`for` attribute to target the input, but while messing with the CSS I
tried putting them directly in the `label()` and it ends up having the
same effect with less code.
2020-02-26 13:45:40 -08:00
Christian Bundy
7db90bd5e9 Fix queries with an unused {index: "DTA"} option
Problem: Trying to use the DTA index when using SSB-Query doesn't work,
because that index only exists on SSB-Backlinks.

Solution: Change the filter to ensure that we're sorted by the asserted
timestamp and ignoring messages from the future. The SSB-Backlinks
plugin was taking the minimum between `.value.timestamp` and `timestamp`
but since we're not using SSB-Backlinks in this query (or maybe at all?)
we get to make our own little hacky query. Cel taught me that the
`$sort` option causes problems here because it buffers the entire result
in memory before doing the sort. Boo. Instead we just need to reference
the property that we want to be sorted by with some operation, even if
it does nothing (like `{ $gt: null }`), but since we're filtering time
travelers we actually need `{ $lge: Date.now() }` there anyway.
2020-02-26 12:16:02 -08:00
Daan Wynen
7ec64e04bf Add config documentation (addresses #254). 2020-02-23 12:09:51 +01:00
Christian Bundy
3838987d55 Refactor default config loader
Problem: We load the default config with `require()`, which would allow
arbitrary JavaScript execution, are producing debug output everywhere
with `console.log()` statements, and don't have instructions for how to
write the config file. The config file is also `.config/**/config.json`,
and I think it would be helpful to specify that this is the **default**
config rather than any other kind of config.

Solution: Rename the config to `~/.config/oasis/default.json`, replace
the `require()` with `fs.readFile()`, remove `console.log()` for
debugging, and add some example JSON for how to use the config file.
2020-02-22 11:23:59 -08:00
Daan Wynen
35c42f6b95 Read settings from ~/.config/oasis/config.json
This should give pretty much expected behaviour. Each config value
can be set by three sources:

1. By command-line argument. If it is not given, then
2. By config file. Or, lastly
3. By default value in the source code.

I can't test that the config file is searched and read from the right
place on windows or macOS, but on linux it works.
2020-02-22 10:32:50 +01:00
Christian Bundy
ed5e6e5f61 Add support for Unix socket with noauth
Problem: We're doing tons of unnecessary cryptography by encrypting the
connection between the "client" and "server", which are often running in
the same process.

Solution: Instead of connecting to the SSB service over TCP and
encrypting the stream, just connect over a socket (supported on Windows,
macOS, and Linux) and don't bother encrypting anything. This is what
Patchwork and Patchbay do already, and since our secret is at
`~/.ssb/secret` then we should be comfortable with `~/.ssb/socket` being
a trusted file where access implies authentication.

Local tests suggest that when sodium-native is available, this commit
reduces the time to render the 'Popular (Day)' page by 17%, but when we
have to fall back to JavaScript cryptography the same page now takes 30%
less time to render. My intuition is that this improvement is more
dramatic on mobile, but requires further testing before we can pat
ourselves on the back too much. :)
2020-02-21 09:23:46 -08:00
Christian Bundy
293dcabe68 Update SSB-Mentions and remove workaround
Problem: We've been using a workaround to filter the results of
SSB-Mentions, but that's just been fixed upstream and so we don't need
the workaround anymore.

Solution: Update the SSB-Mentions package and remove the workaround.
2020-02-19 14:38:10 -08:00
Christian Bundy
a775c99421 Remove private posts from public views
Problem: During the SSB-Query refactor I used `{ private: false }` in an
attempt to hide private messages, but apparently this option is only
available via SSB-Backlinks, so it was ignored without any warning (!).
This allowed private messages to be displayed in public views.

Solution: Remove the unused option and add a filter to public views that
ensures that private messages are always hidden.
2020-02-19 10:27:06 -08:00
Cinnamon
6f5de95d01
Merge pull request #230 from christianbundy/no-messages-by-type
Replace messagesByType() with SSB-Query read
2020-02-18 21:24:14 -08:00
Cinnamon
96e60868cd
Merge pull request #234 from christianbundy/no-img-border
Remove image border
2020-02-18 21:20:18 -08:00
Cinnamon
cef75354ae
Merge pull request #236 from christianbundy/no-private-mentions-page
Remove private messages from Mentions
2020-02-18 12:31:01 -08:00
Cinnamon
545944a73e
Merge pull request #235 from christianbundy/friendly-EADDRINUSE
Add friendly EADDRINUSE error message
2020-02-18 12:27:36 -08:00
Christian Bundy
b22f458da1 Remove private messages from Mentions
Problem: Private messages should only be showing up in the Private page,
not the Mentions page, but right now they're showing up in Mentions.

Solution: Add a check to ensure that Mentions doesn't have any private
messages.
2020-02-18 11:44:40 -08:00
Christian Bundy
00943affea Add friendly EADDRINUSE error message
Problem: When the port was already taken by another process we've been
dumping a big esoteric error message that really isn't helpful for most
people.

Solution: Catch the error and give our users a friendly error message
with a suggestion on how to run Oasis on another port.
2020-02-18 11:34:21 -08:00
Cinnamon
6c6c46e4be
Merge pull request #233 from christianbundy/publish-redirect-latest
Redirect to Latest after publishing new message
2020-02-18 11:19:31 -08:00
Christian Bundy
a0449cefe0 Remove image border
Problem: I added an image border to try to make it easier to see the
boundaries of images but it's not really necessary and at least one
person didn't love it, which is grounds for removal.

Solution: Get it out of here! This commit removes the image border and
also removes a random `console.log()` that shouldn't have been left in
`src/index.js`.
2020-02-18 11:15:43 -08:00
Jonathan Dahan
16f19e85fb
Merge pull request #232 from christianbundy/add-version
Add Oasis version to settings
2020-02-18 14:03:41 -05:00
Cinnamon
4a24e7a663
Merge pull request #223 from christianbundy/summaries-page
Create 'Summaries' page for new summary view
2020-02-18 10:56:28 -08:00
Christian Bundy
97c71be4bd Redirect to Latest after publishing new message
Problem: After publishing a message you were redirected to the Popular
view, which wasn't good feedback that your message had been published.

Solution: After publishing a new message, redirect to the Latest view.
2020-02-18 10:52:37 -08:00
Christian Bundy
8088a9aa8b Add Oasis version to settings
Problem: It was impossible to tell which version of Oasis you're
running, which makes it hard to know when you need to update.

Solution: Put the version in the settings so it's easy to reference.
2020-02-18 10:44:36 -08:00
Christian Bundy
aa6f797937 Replace messagesByType() with SSB-Query read
Problem: The `messagesByType()` queries don't let us sort by asserted
time, which means that we can get messages from a long time ago that
just ended up on our computer.

Solution: Use SSB-Query everywhere. The query syntax isn't really my
favorite but it lets us make declarative queries that respect the
asserted timestamp instead of just the received timestamp.
2020-02-17 17:11:18 -08:00
Christian Bundy
99c51b4a12 Redirect search to SSB references
Problem: There wasn't an easy way to copy and paste a message ID, feed
ID, or blob ID and get directed to that page in Oasis.

Solution: When someone pastes one of the above into the search, just
redirect the browser to the correct page rather than searching for that
text.
2020-02-17 12:46:37 -08:00
Christian Bundy
58b4d419f7 Create 'Summaries' page for new summary view
Problem: Until we have a way to change the view of each page, it seems
to me that each of the views that we're experimenting with should be on
their own page rather than modifying the existing pages to add more
functionality. I'm also noticing that I can't process all of the
information that's on the screen when the new horizontal layout is used,
and I think we would benefit from using the previous layout
consistently.

Solution: Move the summary view to its own page so that we can continue
to iterate on it without modifying the popular view, which is already
complex, and revert the style changes to maintain consistency with the
rest of the linear design (threads go downward, indentation denotes
sub-threads, etc).
2020-02-17 12:08:03 -08:00
Jonathan Dahan
5b37240067
Merge pull request #218 from christianbundy/fix-like
Fix likes not working with Patchwork as server
2020-02-17 11:43:48 -05:00
Vincent Ahrend
2e7bc4739b Add code style fixes 2020-02-17 12:57:01 +01:00
Vincent Ahrend
6977cc3ee3 Show a preview of comments in post listings 2020-02-16 20:14:23 +01:00
Christian Bundy
3abd28ade2 Fix likes not working with Patchwork as server
Problem: Recently we refactored the code so that we calls over MuxRPC
used promises, which was incompatible with the client-side SSB-Tangle
plugin that was expecting a callback. While debugging this error, I also
noticed that our `{ ws: { http: false } }` code wasn't doing anything,
and that our connection error handler was handling all kinds of
unrelated errors that would make debug more difficult.

Solution: Use `util.promisify()` to convert the callback-style function
into a promise-style function, remove the unused SSB-WS code, and reduce
the scope of the error catcher so that it'll continue to output errors
unless they're "cannot connect to sbot".
2020-02-16 10:24:42 -08:00
Cinnamon
e9a7cc5fa1
Merge pull request #215 from christianbundy/default-about
No more `null` for unknown names and descriptions
2020-02-14 20:49:02 -08:00
Christian Bundy
21c19ed70a No more null for unknown names and descriptions
Problem: When we couldn't figure out someone's name or description we
were using `null`, which got coerced to a string and ended up with us
calling people `"@null"`. Not ideal!

Solution: Support a use-case where someone doesn't have a profile
description or a name, and use the first 8 characters of their public
key for their name if they haven't set a name themselves.
2020-02-14 13:58:59 -08:00
Christian Bundy
876ba89947 Hide custom publish behind publish menu
Problem: The new custom publish was called 'Manual mode', which I'm
afraid isn't super easy to understand for people who don't already know
SSB. The custom publishing page didn't follow the same conventions as
other pages, either.

Solution: Hide the custom publish mode behind the publish page, with a
warning that it's for 'advanced users', and ensure that it uses the same
conventions and visual styles as other pages and code around the app.
2020-02-14 12:33:26 -08:00
Daan Wynen
5c038e70a3 [WIP] raw json submission form 2020-02-14 20:50:36 +01:00
Christian Bundy
8a9e260728 Fix publish not working without content warning
Problem: The new content warning code was applying a content warning to
all posts, which tried to publish an invalid content warning `""` and
threw an error.

Solution: Only publish a content warning if it's a string with non-zero
length.
2020-02-13 15:55:41 -08:00
Cinnamon
3f78b98a30
Merge pull request #206 from christianbundy/fix-popular
Fix popular page to only show posts from following
2020-02-12 17:43:35 -08:00
Cinnamon
dc4e0fed91
Merge pull request #207 from christianbundy/no-private-mentions
Remove automatic mentions from private threads
2020-02-12 17:42:10 -08:00
Christian Bundy
81f83e0e7b Use color emoji in Markdown posts
Problem: Emoji from Markdown posts were being displayed in the default
font, which doesn't always use color emoji.

Solution: Use the `.emoji` CSS class on those emoji to ensure that the
correct emoji font is used.
2020-02-12 12:25:55 -08:00
Christian Bundy
2bc3aed067 Remove automatic mentions from private threads
Problem: When replying to a private thread we already know who the
recipients are, and they're already going to get the notification, so
there's really no reason to add a mention.

Solution: Remove the mention when the message is private.
2020-02-12 11:00:23 -08:00
Christian Bundy
683f7ead9d Fix popular page to only show posts from following
Problem: Previously we were only counting likes from people you follow,
but showing messages from anyone. This was backward, and could
potentially show messages from blocked authors that were liked by people
you follow.

Solution: Move the `socialFilter()` invocation down the pipeline so that
it sorts the output messages, not the likes.
2020-02-12 10:36:28 -08:00
Henning Schumann
18fc02dc87 Started German translation 2020-02-12 16:47:09 +01:00
Christian Bundy
9f98ff41c8 Fix umbrella "message not found" and invalid msgs
Problem: Any error thrown while looking for thread ancestors was
throwing a "message not found" error, which was incorrect and useless.
This error caused me to his refresh repeatedly, not understanding that I
was publishing multiple messages. Super bad. While investigating this I
found that there's a slightly different problem where someone can post
an *invalid* message link, which we don't currently have handling for.

Solution: Only show that error when it's actually happening, and add
support for just ignoring when we see an invalid message link as `root`
or `fork`.
2020-02-11 20:14:48 -08:00
Christian Bundy
bc5c242bfb Fix sources that didn't return promises
Problem: In the old `cooler.read()` implementation, sources returned
promises, but that isn't the case in the native SSB-Client promise
impelementation. This means that in at least one place, there's a bug
where it tries to call `.then()` on a non-promise.

Solution: Remove promise-based code from streams, which don't require
any special handling anymore.
2020-02-11 20:01:12 -08:00
Jonathan Dahan
adfed1bead Add content warning publishing, fixes #191 2020-02-11 22:18:10 -05:00
Cinnamon
0cfd824677
Merge pull request #196 from christianbundy/ssb-client-promises
Replace cooler methods with SSB-Client promises
2020-02-11 17:55:36 -08:00
Christian Bundy
8071382874 Fix extended page so it doesn't show your posts
Problem: Your posts show up in Extended, which is unexpected because I'm
the center of my network, not some rando at the periphery.

Solution: Use the `socialFilter()` function to make sure that the
extended view only shows people in your extended network, not you. :)
2020-02-11 13:25:16 -08:00
Christian Bundy
1e28b29758 Replace cooler methods with SSB-Client promises
Problem: We started using `cooler.get()` and `cooler.read()` because it
was impossible to use promises with SSB-Client.

Solution: I made some downstream pull requests into the MuxRPC module
and the SSB-Client module, which means that both of them now natively
support promises. This commit removes the weird convenience methods and
replaces them with the native promise support, which should hopefully
make the code easier to read and write.
2020-02-11 13:20:50 -08:00
Joshua Kelly
f7ab71e891 Changes /meta to /settings
Problem: meta was renamed in the UI to settings, but the URLs say meta

Solution: Rename them to /settings/*
2020-02-10 18:07:55 -08:00
Christian Bundy
410b97e9e4 Fix bug where others could still change your name
Problem: There was one missing component that would filter out nicknames
from other people. This caused a problem where we could get a name for a
feed but it could've been assigned by a friend, which we don't want
right now.

Solution: Ensure that the subject of the message is the same as the
author of the message.
2020-02-09 13:50:49 -08:00
Cinnamon
2295e7858a
Merge pull request #184 from christianbundy/get-about
Use custom getAbout() to replace SSB-About
2020-02-08 19:36:45 -08:00
Christian Bundy
df11dc07bc Add basic robots.txt to keep search engines away
Problem: Search engines are controversial and my understanding is that
most people on SSB don't want their messages indexed by search engines.
If that's the case, we should probably disable it.

Solution: Add basic `robots.txt` file to ask search engines to stay away
and please don't save info. I'm concerned that, like `publicWebHosting`
redactions, it gives a false sense of privacy, but it seems like this is
probably what most people would want?
2020-02-08 19:04:08 -08:00
Christian Bundy
e3c0b65e5c Use custom getAbout() to replace SSB-About
Problem: The SSB-About plugin is incompatible with our needs. More info
in the GitHub issue linked below and in the code comments.

Solution: Unfortunately, roll our own alternative to the SSB-About
plugin so that we can be 100% sure that it pulls the latest 'about'
published by an author about themselves and doesn't just skip `false`.
2020-02-08 18:50:06 -08:00
Cinnamon
d944d8f711 Merge pull request #181 from christianbundy/public-option
Add --public option for public viewers
2020-02-08 16:07:18 -08:00
Christian Bundy
803538628c Fix and document socialFilter()
Problem: The `socialFilter()` function wasn't documented and contained a
bug where it wouldn't show your posts when `following = true`. This is
because you usually don't follow yourself, so `following = true` was
basically equivalent to `me = false`.

Solution: Add some documentation and resolve the bug by adding special
handling for when the message is from us *before* passing to the general
implementation for follow/block checking.

Resolves https://github.com/fraction/oasis/issues/155
Resolves https://github.com/fraction/oasis/issues/177
2020-02-08 11:13:51 -08:00
Christian Bundy
0236358dc8 Add --public option for public viewers
Problem: It's hard to show off Oasis or take screenshots without
respecting the `publicWebHosting` convention. While `publicWebHosting`
lacks a formal specification and I'm a bit confused about what its
boundaries are, it sounds like some of our friends would like to avoid
us publishing any of their content on the public web if we can avoid it.

Solution: Add --public option that turns Oasis into a public web viewer.
This makes it **slightly inconvenient** to see these public posts, but
should absolutely not be mistaken for a privacy guarantee. Only HTTP GET
endpoints are allowed, so random people can't publish or change
settings. The name, avatar, description, content warning, and message
contents are replaced with "Redacted", but again, this is all public
information that we can never provide real privacy for.

Resolves https://github.com/fraction/oasis/issues/48
2020-02-08 10:46:57 -08:00
Cinnamon
7ee77172f2
Merge branch 'master' into add-invite-code 2020-02-06 14:22:55 -08:00
Christian Bundy
20b8bd188b Re-add publish to nav menu
Problem: Publish was missing! Oops.

Solution: Re-add it.

Resolves https://github.com/fraction/oasis/issues/171
2020-02-06 11:44:37 -08:00
Cinnamon
e6844eb1c4
Merge pull request #169 from christianbundy/fix-blob-sniff
Remove nosniff from blob URLs
2020-02-05 19:31:18 -08:00
Christian Bundy
0240401413 Remove nosniff from blob URLs
Problem: We use nosniff to keep the web browser from getting confused
about what kinds of content we're serving in Oasis, but this causes
problems for blob URLs that have arbitrary data.

Solution: Remove nosniff on blob URLs to let the browser figure out what
kind of content we're serving.

Resolves https://github.com/fraction/oasis/issues/138
2020-02-05 17:03:04 -08:00
Christian Bundy
602a495c7c Fix emoji and breaking space in main nav
Problem: The regular space in the sidebar emoji was breaking the line at
a specific viewport width and the emoji were being shown as the wrong
font.

Solution: Use a non-breaking space and `font-family: initial` for
full-color emoji instead of using the system font.

Resolves https://github.com/fraction/oasis/issues/150
Resolves https://github.com/fraction/oasis/issues/153
2020-02-05 14:35:30 -08:00
Cinnamon
8304dce44e
Merge pull request #161 from christianbundy/private-mentions-publish
Add view info for Private, Mentions, and Publish
2020-02-05 12:50:50 -08:00
Christian Bundy
a642d20edd Fix socialFilter() to change { me = null }
Problem: The socialFilter was hiding posts published by the user, which
felt weird and uncanny.

Solution: Fix the default so that `{ me }` isn't hidden from a view
unless the model specifically wants that to happen.

Resolves https://github.com/fraction/oasis/issues/156
2020-02-04 18:05:50 -08:00
Christian Bundy
d212948833 Add view info for Private, Mentions, and Publish
Problem: The Private and Mentions page didn't have view labels yet, and
Publish should be its own page instead of being at the top of every
page.

Solution: Inspired by @cinnamon-bun's work to add friendly view labels,
plus a new Publish page.  This also moves the period selection from the
popular page into the view label, which felt better to me with the
previous `<section>` background. I also tried a different text format
for describing the pages, using a common form and using `<strong>` to
draw attention to any change from "Posts from people you follow, sorted
by recency" which feels like the expected default for most people.

@cinnamon-bun: To me this feels like a fun back-and-forth where I'm
riffing on your work and hoping that you do the same, but if it feels
wrong/rude please let me know. Trying to work on designs with a system
like C4 is super new for me and I wouldn't be surprised if there are
pain points to fix!

Resolves https://github.com/fraction/oasis/issues/160
2020-02-04 17:52:50 -08:00
Christian Bundy
547ceeeac9 Add basic follow-back invites to settings page
Problem: There was no way to onboard new users since we couldn't redeem
invites.

Solution: Add basic follow-back invites to the settings page. This takes
an invite string, runs it through invite.accept, and either returns the
error in full *or* redeems the invite quietly.
2020-02-04 15:03:05 -08:00
Cinnamon
351ee2a2b5 remove leftover console.log 2020-02-04 14:21:33 -08:00
Cinnamon
b79ece89e6 add title to likes page 2020-02-04 13:59:54 -08:00
Cinnamon
479285d244 add help text explaining what is in each view 2020-02-04 13:30:28 -08:00
Christian Bundy
de117f8416 Merge branch 'master' of github.com:fraction/oasis into add-i18n 2020-02-04 09:57:45 -08:00
Cinnamon
ebdee55d80
Merge pull request #148 from christianbundy/add-topics-page
Add topics page
2020-02-04 09:45:33 -08:00
Cinnamon
7dfd84b65e
Merge pull request #146 from christianbundy/no-strangers
No strangers
2020-02-03 21:55:27 -08:00
Christian Bundy
1099395dfa Merge branch 'master' of github.com:fraction/oasis into add-i18n 2020-02-03 21:51:59 -08:00
Cinnamon
01d2ad7781
Merge pull request #133 from christianbundy/faster-following
Make 'Following' page way faster
2020-02-03 21:40:32 -08:00
Cinnamon
833e74ae8a
Merge pull request #141 from christianbundy/fix-search
Fix search hanging when querying 3 or fewer chars
2020-02-03 21:34:28 -08:00
Cinnamon
1a25b09cbc
Merge pull request #143 from christianbundy/fix-img
Fix /image/ URL returning a broken image
2020-02-03 21:25:43 -08:00
Cinnamon
4d00893981
Merge pull request #145 from christianbundy/fix-key-not-found
Make "key not found" error more useful
2020-02-03 21:19:46 -08:00
Christian Bundy
7f40a99799 Add 'Topics' page to show latest root posts
Problem: @masukomi pointed out that the 'latest' view doesn't show the
awesome slice of content that you'll see if you just look at root posts.

Solution: Let's experiment with them! This commit adds a 'Topics' page
that has the latest root posts from people you're following.
2020-02-02 16:54:37 -08:00
Christian Bundy
e28095e27d Fix nav alignment on smaller screens
Problem: The nav is aligned to the left of the screen on mobile, which
feels off-center and unbalanced on mobile. https://github.com/fraction/oasis/issues/135

Solution: Center the menu to optimize for space around the links.
2020-02-02 16:43:15 -08:00
Christian Bundy
c2ea8f7cb5 Hide strangers on popular+latest and hide blocked
Problem: We shouldn't be showing any strangers on the popular or latest
pages. We shouldn't be showing anyone who's been blocked on any of those
feeds.

Solution: Don't show blocked people on any pages and don't show
strangers on the popular / latest pages.
2020-02-02 16:37:49 -08:00
Christian Bundy
9258f4753c Make "key not found" error more useful
Problem: If the user tries to see a thread and the link points to a
message we don't have, then we don't have any way to display anything in
the thread. How could we even know which thread it's in?

Solution: Throw the error but make it more useful and fix the "non-error
thrown" verbiage that we've inherited from a dependency trying to throw
a non-error.
2020-02-02 15:36:15 -08:00
Christian Bundy
d0e98b9663 Fix /image/ URL returning a broken image
Problem: I think during a refactor this code was changed and ended up
breaking the "fake image" that we return when the user doesn't have an
image. We also don't see image errors because they aren't in the browser
viewport if they return text and we don't `console.error()` our errors.

Solution: Fix the image code to return a PNG as a buffer and duplicate
errors to stderr.
2020-02-02 14:42:40 -08:00
Christian Bundy
5635b36074 Merge branch 'master' of github.com:fraction/oasis into fix-search 2020-02-02 12:24:06 -08:00
Christian Bundy
b0103ad847 Fix search hanging when querying 3 or fewer chars
Problem: SSB-Search has a bug where too few characters just hangs the
search indefinitely and never returns. https://github.com/fraction/oasis/issues/107

Solution: Enforce a minimum length of 3 characters in the search. I
bumped into another bug where HyperScript, a dependency of HyperAxe,
doesn't support the `minlength` attribute, so I had to deploy a small
workaround for that too. The fixes aren't very pretty but they're better
than just ignoring the problem.
2020-02-02 12:20:47 -08:00
Christian Bundy
edf87a70df Persist language in cookies and fix fork drop-down
Problem: The previous commits didn't persist language choices and the
drop-down's initial value wasn't respecting the language you selected.

Solution: Persist the language choice in a cookie, defaulting to
English, and build the drop-down with the selected language. This also
changes the word "Spanish" to "Español", and slightly refactors
`http.js` to accept *middleware* rather than just routes. This lets us
add other middleware, such as the language selection middleware added in
this commit.
2020-02-02 09:31:43 -08:00
bramdroid
7acd841f3f
Update i18n.js 2020-02-01 14:27:24 -08:00
Christian Bundy
5225deef39 Remove duplicate condition 2020-02-01 14:16:06 -08:00
Christian Bundy
339fbdcf6a Add super basic language selection
Problem: The previous commit added English as a language but didn't add
other languages or ways to switch between them.

Solution: Add the most primitive language selection possible and a few
small translations contributed by @bramdroid during a totally unrelated
conversation. This does not persist the language selection and doesn't
auto-select the current language from the dropdown, but those should be
easy to add in the future.
2020-02-01 14:08:37 -08:00
Christian Bundy
214ef3335e Add basic scaffolding for internationalization
Problem: It was impossible to do any internationalization because
strings were all embedded throughout Oasis.

Solution: Add an internationalization submodule that provides
language-specific strings for the text elements in views. In future
commits we can add language selection and fallbacks for when the
selected language doesn't support the text we need to have translated.
2020-02-01 13:20:22 -08:00
Christian Bundy
75b5beeb24 Make 'Following' page way faster
Problem: The 'Following' page was super slow because we were doing a
MuxRPC request on every single message.

Solution: Do one request to see who we have relationships with, filter
out the people we aren't following, and then check against that list
instead of doing a bunch of MuxRPC calls.

| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|:---|---:|---:|---:|---:|
| `curl http://localhost:3000/public/latest/following` | 500.9 ± 163.4 | 392.1 | 881.4 | 1.00 |
| `curl http://localhost:3456/public/latest/following` | 4663.7 ± 184.6 | 4438.6 | 5075.2 | 9.31 ± 3.06 |
2020-01-31 21:31:33 -08:00