From 66c48c26e60267e94fbeb129135f8bb7f5ace971 Mon Sep 17 00:00:00 2001 From: Peter Bhat Harkins Date: Sun, 15 Oct 2017 14:51:29 -0400 Subject: [PATCH] lobste.rs icon and views --- app/assets/stylesheets/local/lobsters.css | 46 ++++ app/views/home/404.html.erb | 11 + app/views/home/about.html.erb | 248 ++++++++++++++++++++++ app/views/home/chat.html.erb | 55 +++++ app/views/home/privacy.html.erb | 9 + app/views/layouts/_footer.html.erb | 16 ++ public/apple-touch-icon-144.png | Bin 0 -> 4536 bytes public/apple-touch-icon.png | Bin 0 -> 1744 bytes public/favicon.ico | Bin 0 -> 11134 bytes 9 files changed, 385 insertions(+) create mode 100644 app/assets/stylesheets/local/lobsters.css create mode 100644 app/views/home/404.html.erb create mode 100644 app/views/home/about.html.erb create mode 100644 app/views/home/chat.html.erb create mode 100644 app/views/home/privacy.html.erb create mode 100644 app/views/layouts/_footer.html.erb create mode 100644 public/apple-touch-icon-144.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico diff --git a/app/assets/stylesheets/local/lobsters.css b/app/assets/stylesheets/local/lobsters.css new file mode 100644 index 00000000..60deda1a --- /dev/null +++ b/app/assets/stylesheets/local/lobsters.css @@ -0,0 +1,46 @@ +li .byline a.story_has_suggestions { + color: #bd6060; +} + +a.tag_announce, a.tag_ask, a.tag_show, a.tag_interview { + background-color: #f9ddde; + border-color: #f0b2b8; +} + +span.hat_openbsd_developer span.crown { + font-family: comic sans ms, comic sans, comic neue, sans-serif; + font-size: 7pt; +} + +span.hat_sysop { + border-color: #bbb2b2; +} +span.hat_sysop span.crown { + background-color: #ddc7c7; +} + +#l_holder { + background: #ee0000 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAL0ALQAtZF7+HAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wCCBAuLt2rqugAAACMSURBVDjL1ZMxCsJQEERfRPEk9im9mGfxBpaCnaXmBraeQEidKsKz2eIb/peEIOLAwu4Ws7PMbsUAKlOwYCaWmd4aWCV1B4yXpR59R61SitwKDdBHfgPaSTsF8zOmHz5NLykAeCRqvuvCfxGcgP0YF3ZqHy7c1Yt6jfo8dCF3idvkQjcRRVQ/f6bZBC+RBoeZnlCyqwAAAABJRU5ErkJggg==) no-repeat; + background-position: center; +} + +@media +only screen and (min-resolution: 2dppx), +only screen and (-webkit-min-device-pixel-ratio: 2) { + #l_holder { + background: #ee0000 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AsLFB03Jr/FjQAAAVZJREFUWMPtlr1KQ0EQhc+ZdZMQEkQlNopKENu8gLWVvkQa8QHs8wQ+h4UPYG+fTpsQEATJhYtFrkKy2btrFYuwV/Kv6D2w1QzLNzPLngFy/XcxK9DpdAr1er05zSXOuUet9cM8ABtZgVKpVAZwDeCAZDDPe58CeCV5B2C5AFprQzICsE9mNsoBiAF0VzajOI4raZre+wk55977/f72Wh7KaDS6CgA8L+NumZYh9ATWCbAy5QA5wN8GMMY0jDGNHwEYDofHSqm2Uqrd6/XKawdQSt2QFJJSrVZPZjajBb/uUxG5GJuYiFRW0YGgRSZJsiMitxPjeFm0A6EKdq215wA+ABRIbgI4AnBJco8kvPcgiSRJopnLa7VaHAwGh9baszRNnwJumHkmctxcK1kURVu1Wu3tKzGwlHifbYjjfO+9FRE98wiKxaL/ZhPKhAqoi1y5cv1mfQLQB8QlNdQ0/wAAAABJRU5ErkJggg==) no-repeat; + background-size: 16px; + background-position: 1px 1px; + } +} + +div#hat_holder { + float: left; + width: 33px; + height: 16px; +} +img#party_hat { + position: relative; + top: -36px; + left: 2px; +} diff --git a/app/views/home/404.html.erb b/app/views/home/404.html.erb new file mode 100644 index 00000000..60cf25d6 --- /dev/null +++ b/app/views/home/404.html.erb @@ -0,0 +1,11 @@ +
+
+ 404 +
+ +
+

+ The resource you requested was not found, or the story has been deleted. +

+
+
diff --git a/app/views/home/about.html.erb b/app/views/home/about.html.erb new file mode 100644 index 00000000..9370c6ec --- /dev/null +++ b/app/views/home/about.html.erb @@ -0,0 +1,248 @@ +
+
+ About +
+ +
+

+ Lobsters is a technology-focused community centered around link aggregation + and discussion. + Launched on July 3rd, 2012, it was created by joshua + stein with some specific design goals in mind to avoid problems faced by + other link aggregation sites: +

+ + + +

+ Tagging +
+ When links/stories are submitted, they must be tagged by the submitter from a + list of predefined tags. Users can choose to filter out all submissions with particular tags, but + rather than use rigidly segmented sub-forums that users must each subscribe + to, all users see all stories by default. The reason for this is threefold: +

+ +
    +
  • + It keeps the site on-topic by only allowing a predefined list of tags. + These tags represent what most of the users of the site want to read, so + content that does not fit into any of those categories should not be + submitted. It also keeps stories organized and more easily searchable. +

  • + +
  • + It promotes discussion. On a site with separate forums, a Ruby programmer + would probably subscribe to a Ruby forum, but not a Python one. When a link + is posted to the Python forum, that Ruby programmer would probably never see + it, even though they may have something useful to say about it (perhaps the + link is about a Python library which does the same thing as a Ruby library + which that Ruby programmer created). On this site, the link would get posted + with a python tag and shown to everyone, + encouraging the Ruby programmer to read and comment on it (unless that Ruby + programmer disliked Python enough to filter it out). +

  • + +
  • + It keeps the conversation centralized. Often stories contain discussion + about more than one topic, yet on other sites they are confined to a single + category/forum, limiting the exposure. The link could be submitted to more + than one forum, but then each conversation would remain separate and users + would rarely interact with users from other forums. On this site, the story + would simply be tagged with multiple tags and all users would see all + discussion about the story in a single location. +

  • +
+ +

+ Creating new tags and retiring old tags is done by the community by + submitting, discussing, and voting on + meta-tagged requests about them. +

+ +

+ Invitation Tree
+ Invitations are used as a mechanism for spam-control and to encourage users + to "be nice". New users must be invited by a current user, though there is + no vetting process and invitations are not intended to promote exclusivity. + The most efficient way to receive an invitation is to talk to someone you + recognize from the site or + <% if Rails.application.allow_invitation_requests? %> + request one publicly. + <% else %> + request one in chat. + <% end %> + Invitations are unlimited unless scaling problems temporarily prevent new + accounts. If spammers are invited to the site and banned, the user that + invited them may also be banned, going up the chain of invitations as needed. +

+ +

+ The full user tree is made public and each user's profile + shows who invited them. This provides some degree of accountability and can + act as a tool to help identify voting rings. +

+ +

+ Downvote Explanations
+ Often on other sites, a user would have his or her comment downvoted without + explanation and then edit their comment to ask why they were downvoted. On + this site, voters must choose a reason before downvoting comments and those + votes are tallied and shown to the original commenter. +

+

+ For submitted stories, downvoting is done through flagging (also requiring a + valid reason) and these flag summaries are shown to all users. +

+ +

+ Transparency Policy
+ All moderator actions on this site are visible to + everyone and the identities of those moderators are made public. While the individual actions of a + moderator may cause debate, there should be no question about which moderator + it was or whether they had an ulterior motive for those actions. +

+ +

+ All user voting and story ranking on this site uses a universal algorithm and + does not artificially penalize or prioritize users or domains. + Per-tag hotness modifiers do affect all stories with + those tags, but these modifiers are made public and usually used to shorten + the life of meta-discussions. If certain domains have to be banned from + being submitted due to spam, the list will be made publicly available. +

+ +

+ If users are disruptive enough to warrant banning, they will be banned + absolutely, given notice of their banning, and their disabled user profile + will indicate which moderator banned them and why. There will be no hidden, + antisocial "shadow banning" or "hellbanning" of users. +

+ +

+ The source code to this site is + made available under a 3-clause BSD license for viewing, auditing, forking, + or contributing to. + Public stats are available for + site + requests, + comments + submitted, + stories + submitted, + total + users, and + users + created per day. +

+ +

+ Other Technical Features +

+
    +
  • + Mailing list mode can be enabled + per-user to receive all new stories (including their plain-text content as + fetched and extracted by Diffbot) and user + comments as e-mails, mirroring discussion threads offline. This makes it + easy and efficient to read new stories as well as keep track of new comments + on old threads or stories, just like technical mailing lists or Usenet of + yore. Each user is assigned a private mailing list address at this domain + which allows them to reply to stories or comments directly in their e-mail + client. These e-mails are then converted and submitted to the website as + comments, just as if the comment was posted through a web browser. +

    + +
  • + Private messaging enables users to communicate privately + without having to publicly disclose an e-mail address, and users can receive + e-mail and Pushover notifications of new + private messages. +

  • + +
  • + Responsive design enhances functionality on smaller screens + such as phones and tablets without having to use a separate URL, 3rd party + (often read-only) websites, or proprietary mobile applications. +

  • + +
  • + Integrated search engine covers all + submitted stories and comments, including full-text caches of all submitted + story contents. Searching for a keyword will often bring up relevant stories + that don't even mention that keyword in the URL or title. +

  • + +
  • + Story merging combats + the problem of multiple stories at different URLs being submitted in a short + timeframe about the same news subject. Rather than have multiple stories on + the front page with fragmented discussions, all similar stories can be merged + into one. An example of a story having been merged + into a previous one, combining all comments on one page. +

  • + +
  • + Fuzzy-matching of submitted story URLs to avoid duplicate + submissions of similar URLs that differ only in http vs. + https, trailing slashes, useless analytics parameters, etc. When + using the story submission bookmarklet, story URLs are automatically + converted to use the page's canonical URL (if available) to present the best + URL to represent the story, as defined by the story's author or publisher. +

  • + +
  • + User-suggested titles and tags can + be automatically applied to a story when a quorum of users agrees on a new + title (such as removing a site's name, or appending the story's year of + publication) or set of tags, without any moderator action required. +

  • + +
  • + Hats are a more formal process of + allowing users to post comments while "wearing such and such hat" to + give their words more authority (such as an employee speaking for the + company, or an open source developer speaking for the project). +

  • + +
  • + Per-tag and site-wide RSS feeds are + available to the public and logged-in users have private RSS feeds that + filter out each user's filtered tags. +

  • + +
  • + Official Twitter + mirror posts all stories that have reached the front page to + the @lobsters account on Twitter + for easy following, retweeting/sharing, or archiving. +

  • + + <% if false %> +
  • + Tor onion/hidden + service for anonymous access to the site. +

  • + <% end %> + +
  • + Stickers are + available to show your support for the site. +

  • +
+ +
+
diff --git a/app/views/home/chat.html.erb b/app/views/home/chat.html.erb new file mode 100644 index 00000000..685e0df9 --- /dev/null +++ b/app/views/home/chat.html.erb @@ -0,0 +1,55 @@ +
+
+ Lobsters Chat +
+ +
+

+ An official real-time discussion channel is available to members and guests + of the site, hosted on the + Freenode IRC network + in #lobsters. This channel was originally + created + by + @kristof. +

+ +

+ The policies and ideals of the discussion channel are the same as the + website; quality content and conversing, respect for other users, and no + spamming. Slightly off-topic discussion is generally acceptable. The + channel isn't busy enough that there's always someone talking, so don't be + surprised if you try to start a conversation and no one responds. Leave it + open and you'll see activity, though we're most active during US work hours. +

+ +

+ New contributors are always welcome on Lobsters, but pestering other members + in the channel for invites is not acceptable. If you are the author or + otherwise involved with a story that was submitted to the site, ask and + someone will invite you. Alternately, offer some good links or thoughts on a + story and someone will likely invite you so can post them. +

+ +

+ Lurking in the channel is a bot called "mockturtle" created and + maintained by @alynpost. + It announces new stories submitted to the site and provides other useful + features like showing the page title of other URLs mentioned in the channel. +

+ +

+ To participate in the discussion, join the + #lobsters channel on + irc.freenode.net with an IRC client. +

+ +

+ For a feed of stories without discussion, mockturtle also posts new + stories in #lobsters-feed + on the same network. +

+ +
+
diff --git a/app/views/home/privacy.html.erb b/app/views/home/privacy.html.erb new file mode 100644 index 00000000..6c3eeb76 --- /dev/null +++ b/app/views/home/privacy.html.erb @@ -0,0 +1,9 @@ +
+
+ Privacy Policy +
+ +

+ This is the Internet, you have no privacy. +

+
diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb new file mode 100644 index 00000000..88e02ddf --- /dev/null +++ b/app/views/layouts/_footer.html.erb @@ -0,0 +1,16 @@ +Moderation Log +<% if @user && @user.can_see_invitation_requests? && (iqc = InvitationRequest.verified_count) > 0 %> + Invitation Queue (<%= iqc %>) +<% end %> +<% if @user && @user.is_moderator? && (hrc = HatRequest.count) > 0 %> + Hat Requests (<%= hrc %>) +<% else %> + Hats +<% end %> +<% if false %> + <% bbs_count = Keystore.get("bbs:nodes_in_use").try(:value).to_i %> + BBS<%= bbs_count == 0 ? "" : " (#{bbs_count})" %> +<% end %> +Wiki +Privacy +About diff --git a/public/apple-touch-icon-144.png b/public/apple-touch-icon-144.png new file mode 100644 index 0000000000000000000000000000000000000000..8223fa3f7bc3bb058f24637d11661aea406ef572 GIT binary patch literal 4536 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 Rn2)couct!;9QJOn{{n$F9~A%q literal 0 HcmV?d00001