From 7055bf256076ff7bf921f6d8ffb13d85b04d7d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Fri, 25 Jan 2019 12:07:53 -0600 Subject: [PATCH 01/14] Added page --- app/client.js | 1 + app/views/dev.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 app/views/dev.js diff --git a/app/client.js b/app/client.js index 76e4235..9b8d032 100755 --- a/app/client.js +++ b/app/client.js @@ -35,6 +35,7 @@ function main() { app.route("/", page(require("./views/home"))); app.route("/api/*", page(require("./views/api"))); + app.route("/dev-program", page(require("./views/dev"))); app.route("/spec", page(require("./views/spec"))); app.route("/*", page(require("./views/redirect"))); diff --git a/app/views/dev.js b/app/views/dev.js new file mode 100644 index 0000000..4cfd605 --- /dev/null +++ b/app/views/dev.js @@ -0,0 +1,29 @@ +"use strict"; + + + +// I M P O R T + +import html from "choo/html"; + + + +// E X P O R T + +export default () => html` +
+ + +
+
+

...

+
+
+
+`; -- 2.43.4 From 23696abdb70b04e881cb7417dd9fc54df866caf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Thu, 31 Jan 2019 09:35:20 -0600 Subject: [PATCH 02/14] Page --- app/views/dev.js | 7 +++++++ app/views/redirect.js | 38 +++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/views/dev.js b/app/views/dev.js index 4cfd605..ce0c3cf 100644 --- a/app/views/dev.js +++ b/app/views/dev.js @@ -27,3 +27,10 @@ export default () => html` `; + +// TODO: +// Provide flow where user logs in with GitHub: +// - get access token +// - show field for user to enter their wallet address +// - send access token and wallet address to API +// - parse response diff --git a/app/views/redirect.js b/app/views/redirect.js index d25daab..1c5b8bc 100644 --- a/app/views/redirect.js +++ b/app/views/redirect.js @@ -48,23 +48,31 @@ export default (state, emit) => { // eslint-disable-line // below should be refactored into components let pageScript = ""; - if (partialPath === "glossary") - pageScript = - ""; + switch(true) { + case partialPath === "glossary": + pageScript = + ""; + break; - if (partialPath === "overview") - pageScript = - ""; + case partialPath === "overview": + pageScript = + ""; + break; - if (partialPath === "playground") - pageScript = - ""; + case partialPath === "playground": + pageScript = + ""; + break; + + default: + break; + } return html`
-- 2.43.4 From 2777e681346c3a96fe2b34163e32d51ddc3d6129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Mon, 4 Feb 2019 17:42:52 -0600 Subject: [PATCH 03/14] Optimizations --- app/components/client/devprogram-scripts.js | 11 ++++ app/components/client/playground-scripts.js | 9 ++- app/dist/scripts/app.js | 3 + app/dist/scripts/plugins/jets.js | 2 +- app/dist/scripts/sockets.js | 28 ++++---- app/helpers/fetch-metadata.js | 32 ++++----- app/helpers/github.js | 10 +++ app/helpers/publish-meme.js | 2 +- app/helpers/upload-image.js | 2 +- app/sockets.js | 73 ++++++++++++--------- app/views/dev.js | 25 ++++--- app/views/home.js | 4 +- app/views/redirect.js | 32 +++++---- documents/developer-program.md | 14 ++++ package.json | 1 + 15 files changed, 155 insertions(+), 93 deletions(-) create mode 100644 app/components/client/devprogram-scripts.js create mode 100644 documents/developer-program.md diff --git a/app/components/client/devprogram-scripts.js b/app/components/client/devprogram-scripts.js new file mode 100644 index 0000000..e58bdc7 --- /dev/null +++ b/app/components/client/devprogram-scripts.js @@ -0,0 +1,11 @@ +"use strict"; /* global document, send */ + + + +document.getElementById("get-started").addEventListener("click", event => { + event.preventDefault(); + + send({ + message: "auth me with github" + }); +}); diff --git a/app/components/client/playground-scripts.js b/app/components/client/playground-scripts.js index 6173481..8b82406 100644 --- a/app/components/client/playground-scripts.js +++ b/app/components/client/playground-scripts.js @@ -111,7 +111,8 @@ function debounce(func, wait, immediate) { const later = () => { timeout = null; - if (!immediate) func.apply(context, args); + if (!immediate) + func.apply(context, args); }; const callNow = immediate && !timeout; @@ -119,7 +120,8 @@ function debounce(func, wait, immediate) { clearTimeout(timeout); timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); + if (callNow) + func.apply(context, args); }; } @@ -139,7 +141,8 @@ function initializePlayground() { } function fetchMetadata(exampleNumber, data) { - if (!exampleNumber) return; + if (!exampleNumber) + return; switch(exampleNumber) { case 1: diff --git a/app/dist/scripts/app.js b/app/dist/scripts/app.js index 3528f98..3dc9a18 100755 --- a/app/dist/scripts/app.js +++ b/app/dist/scripts/app.js @@ -26,6 +26,9 @@ if ( // Smooth scroll document.querySelectorAll("a[href^='#']").forEach(anchor => { + if (anchor.classList.contains("no-smooth")) // Ignore smooth scroll functionality + return; + anchor.addEventListener("click", event => { event.preventDefault(); diff --git a/app/dist/scripts/plugins/jets.js b/app/dist/scripts/plugins/jets.js index 0b1a750..23eca43 100644 --- a/app/dist/scripts/plugins/jets.js +++ b/app/dist/scripts/plugins/jets.js @@ -224,7 +224,7 @@ ;(function(doc, proto) { try { doc.querySelector(":scope body"); - } catch (err) { + } catch(err) { ["querySelector", "querySelectorAll"].forEach(method => { const nativ = proto[method]; diff --git a/app/dist/scripts/sockets.js b/app/dist/scripts/sockets.js index 409bca8..1b7d302 100644 --- a/app/dist/scripts/sockets.js +++ b/app/dist/scripts/sockets.js @@ -12,22 +12,22 @@ document.addEventListener("DOMContentLoaded", () => { let ws = null; function checkWebSocketConnection() { - if (!ws || ws.readyState === 3) initializeWebSocketConnection(); + if (!ws || ws.readyState === 3) + initializeWebSocketConnection(); } function initializeWebSocketConnection() { ws = new WebSocket(location.origin.replace(/^http/, "ws")); - ws.onopen = () => { - console.log("WebSocket connection established"); // eslint-disable-line - }; + ws.onopen = () => console.log("WebSocket connection established"); // eslint-disable-line ws.onmessage = socket => { const data = JSON.parse(socket.data); switch(true) { case data.message === "show result": - if (!data.example) return; + if (!data.example) + return; document.querySelector(data.selector).innerHTML = data.html; @@ -60,8 +60,8 @@ function initializeWebSocketConnection() { } if (data.example === 2) { - detectLanguageAndUpdate(); // eslint-disable-line - initCanvas(); // eslint-disable-line + detectLanguageAndUpdate(); // eslint-disable-line no-undef + initCanvas(); // eslint-disable-line no-undef setTimeout(() => { document.querySelector(".playground-content__meme__canvas__thumbnail").click(); @@ -94,25 +94,23 @@ function initializeWebSocketConnection() { break; default: - console.log(data); // eslint-disable-line + console.log(data); // eslint-disable-line no-console break; } }; - ws.onclose = () => { - console.log("WebSocket connection lost"); // eslint-disable-line - checkWebSocketConnection(); // reconnect now - }; + ws.onclose = () => checkWebSocketConnection(); // reconnect now } -function send(msg) { // eslint-disable-line - socketReady(ws, () => ws.send(msg)); +function send(msg) { // eslint-disable-line no-unused-vars + socketReady(ws, () => ws.send(JSON.stringify(msg))); } function socketReady(socket, callback) { setTimeout(() => { if (socket && socket.readyState === 1) { - if (callback !== undefined) callback(); + if (callback !== undefined) + callback(); return; } diff --git a/app/helpers/fetch-metadata.js b/app/helpers/fetch-metadata.js index 0ca2f34..0a885eb 100644 --- a/app/helpers/fetch-metadata.js +++ b/app/helpers/fetch-metadata.js @@ -11,16 +11,16 @@ import stringifyObject from "stringify-object"; // U T I L S -import randomString from "./random-string"; import messageSlack from "./slack"; - import publishMeme from "./publish-meme"; +import randomString from "./random-string"; +import { send } from "@socket"; import uploadImage from "./upload-image"; const allowedQueryMethods = [ + "claim_tip", "publish", - "resolve", - "claim_tip" + "resolve" ]; const approvedContentIdsForTipping = [ @@ -60,11 +60,11 @@ export default async(data, socket) => { const resolveMethod = data.method; if (allowedQueryMethods.indexOf(resolveMethod) < 0) { - return socket.send(JSON.stringify({ + return send(socket, { details: "Unallowed resolve method for tutorial", message: "notification", type: "error" - })); + }); } body.authorization = process.env.LBRY_DAEMON_ACCESS_TOKEN; @@ -77,7 +77,7 @@ export default async(data, socket) => { // E X A M P L E case resolveMethod === "claim_tip": if (!approvedContentIdsForTipping.includes(claimAddress)) { - return socket.send(JSON.stringify({ + return send(socket, { example: data.example, html: raw(`

Response

@@ -85,7 +85,7 @@ export default async(data, socket) => { `), message: "show result", selector: `#example${data.example}-result` - })); + }); } apiRequestMethod = "POST"; @@ -140,7 +140,7 @@ export default async(data, socket) => { "json" ); - return socket.send(JSON.stringify({ + return send(socket, { example: data.example, html: raw(`

Response

@@ -149,15 +149,15 @@ export default async(data, socket) => { `), message: "show result", selector: `#example${data.example}-result` - })); + }); } catch(memePublishError) { - socket.send(JSON.stringify({ + send(socket, { details: "Meme publish failed", message: "notification", type: "error" - })); + }); if (process.env.NODE_ENV !== "development") { messageSlack({ @@ -172,11 +172,11 @@ export default async(data, socket) => { } catch(imageUploadError) { - socket.send(JSON.stringify({ + send(socket, { details: "Image upload failed", message: "notification", type: "error" - })); + }); if (process.env.NODE_ENV !== "development") { messageSlack({ @@ -241,7 +241,7 @@ export default async(data, socket) => { "json" ); - return socket.send(JSON.stringify({ + return send(socket, { example: data.example, html: raw(`

Response

@@ -250,7 +250,7 @@ export default async(data, socket) => { `), message: "show result", selector: `#example${data.example}-result` - })); + }); } return response.body.result[Object.keys(response.body.result)[0]].claim; diff --git a/app/helpers/github.js b/app/helpers/github.js index 2beaf95..7e6ec59 100644 --- a/app/helpers/github.js +++ b/app/helpers/github.js @@ -336,6 +336,15 @@ function generateUrl(type, event) { } } +function getGitHubUserToken() { + // const clientWithAuth = new Octokit({ + // auth: `token ${GITHUB_APP_TOKEN}` + // }); + + // console.log(clientWithAuth); + // console.log("—————"); +} + function updateGithubFeed() { octokit.activity.listPublicEventsForOrg({ org: "lbryio", @@ -377,5 +386,6 @@ export { generateEvent, generateGitHubFeed, generateUrl, + getGitHubUserToken, updateGithubFeed }; diff --git a/app/helpers/publish-meme.js b/app/helpers/publish-meme.js index 358273d..57ab4c0 100644 --- a/app/helpers/publish-meme.js +++ b/app/helpers/publish-meme.js @@ -28,7 +28,7 @@ export default async(publishMetadata) => { try { const response = await got.put(queryUrl, options); return response.body; // eslint-disable-line padding-line-between-statements - } catch (error) { + } catch(error) { return error; } }; diff --git a/app/helpers/upload-image.js b/app/helpers/upload-image.js index 5239fe1..ccebd3a 100644 --- a/app/helpers/upload-image.js +++ b/app/helpers/upload-image.js @@ -28,7 +28,7 @@ export default async(imageSource) => { try { const response = await got.post(queryUrl, options); return response.body; // eslint-disable-line padding-line-between-statements - } catch (error) { + } catch(error) { return error; } }; diff --git a/app/sockets.js b/app/sockets.js index 6654f2a..f34c855 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -18,7 +18,10 @@ import messageSlack from "@helper/slack"; // P R O G R A M export default (socket, action) => { - if (typeof socket !== "object" && typeof action !== "object") return; + if (typeof socket !== "object" && typeof action !== "object") + return; + + action = JSON.parse(action); switch(true) { case action.message === "fetch metadata": @@ -27,31 +30,31 @@ export default (socket, action) => { case action.message === "landed on homepage": generateGitHubFeed(result => { - socket.send(JSON.stringify({ + send(socket, { html: result, message: "updated html", selector: "#github-feed" - })); + }); }); break; case action.message === "landed on playground": generateContent(1, result => { - socket.send(JSON.stringify({ + send(socket, { html: result, message: "updated html", selector: "#playground-loader" - })); + }); }); break; case action.message === "request for playground, example 1": generateContent(1, result => { - socket.send(JSON.stringify({ + send(socket, { html: result, message: "updated html", selector: "#playground-loader" - })); + }); }); break; @@ -61,11 +64,11 @@ export default (socket, action) => { case action.message === "request for playground, example 3": generateContent(3, result => { - socket.send(JSON.stringify({ + send(socket, { html: result, message: "updated html", selector: "#playground-loader" - })); + }); }); break; @@ -85,15 +88,19 @@ export default (socket, action) => { function generateContent(exampleNumber, displayTrendingContent) { if (exampleNumber === 1) { return getTrendingContent().then(response => { - if (!response || !response.success || response.success !== true || !response.data) return ""; + if (!response || !response.success || response.success !== true || !response.data) + return ""; const rawContentCollection = []; const renderedContentCollection = []; const trendingContentData = response.data; - for (const data of trendingContentData) { - rawContentCollection.push(fetchMetadata({ claim: data.url, method: "resolve", example: exampleNumber })); - } + for (const data of trendingContentData) + rawContentCollection.push(fetchMetadata({ + claim: data.url, + example: exampleNumber, + method: "resolve" + })); Promise.all(rawContentCollection).then(collection => { for (const part of collection) { @@ -116,7 +123,7 @@ function generateContent(exampleNumber, displayTrendingContent) { `); - } catch (err) { + } catch(err) { return; // TODO: Return nice error message } } @@ -315,19 +322,19 @@ function generateMemeCreator(socket) { `; - return socket.send(JSON.stringify({ + return send(socket, { example: 2, html: memeCreator, message: "updated html", selector: "#playground-loader" - })); + }); } async function getTrendingContent() { try { const response = await got("https://api.lbry.io/file/list_trending"); return JSON.parse(response.body); // eslint-disable-line padding-line-between-statements - } catch (error) { + } catch(error) { return error; } } @@ -344,22 +351,24 @@ function makeImageSourceSecure(url) { async function newsletterSubscribe(data, socket) { const email = data.email; - if (!validateEmail(email)) return socket.send(JSON.stringify({ - class: "error", - html: "Your email address is invalid", - message: "updated html", - selector: "#emailMessage" - })); + if (!validateEmail(email)) { + send(socket, { + class: "error", + html: "Your email address is invalid", + message: "updated html", + selector: "#emailMessage" + }); + } try { await got.post(`https://api.lbry.io/list/subscribe?email=${encodeURIComponent(email)}&tag=developer`); - return socket.send(JSON.stringify({ + return send(socket, { html: "Thank you! Please confirm subscription in your inbox.", message: "updated html", selector: "#emailMessage" - })); - } catch (error) { + }); + } catch(error) { const response = JSON.parse(error.body); if (!response.success) { @@ -369,12 +378,12 @@ async function newsletterSubscribe(data, socket) { `> _Cause: ${email} interacted with the form_\n` ); - return socket.send(JSON.stringify({ + return send(socket, { class: "error", html: response.error, message: "updated html", selector: "#emailMessage" - })); + }); } messageSlack( @@ -383,15 +392,19 @@ async function newsletterSubscribe(data, socket) { `> _Cause: ${email} interacted with the form_\n` ); - return socket.send(JSON.stringify({ + return send(socket, { class: "error", html: "Something is terribly wrong", message: "updated html", selector: "#emailMessage" - })); + }); } } +export function send(transport, data) { + return transport.send(JSON.stringify(data)); +} + function validateEmail(email) { const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\\.,;:\s@"]{2,})$/i; return emailRegex.test(String(email)); // eslint-disable-line padding-line-between-statements diff --git a/app/views/dev.js b/app/views/dev.js index ce0c3cf..d41a15f 100644 --- a/app/views/dev.js +++ b/app/views/dev.js @@ -15,22 +15,27 @@ export default () => html` -
+
-

...

+

When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs.

+

To qualify for free LBC you must:

+ +
    +
  • have a GitHub account, and
  • +
  • have a public PR (pull request) in the past year
  • +
+ +

If this sounds like you, get started here!

+ +

+ If you have not downloaded our SDK yet, you should and generate a wallet address so we know where to send your LBC! +

`; - -// TODO: -// Provide flow where user logs in with GitHub: -// - get access token -// - show field for user to enter their wallet address -// - send access token and wallet address to API -// - parse response diff --git a/app/views/home.js b/app/views/home.js index 62899e4..fb8af66 100644 --- a/app/views/home.js +++ b/app/views/home.js @@ -96,9 +96,7 @@ export default () => html` "; + pageScript = renderClientScript("glossary-scripts"); break; case partialPath === "overview": - pageScript = - ""; + pageScript = renderClientScript("ecosystem-scripts"); break; case partialPath === "playground": - pageScript = - ""; + pageScript = renderClientScript("playground-scripts"); break; default: @@ -93,3 +87,15 @@ export default (state, emit) => { // eslint-disable-line `; }; + + + +// H E L P E R + +function renderClientScript(clientScriptFileName) { + return ` + + `; +} diff --git a/documents/developer-program.md b/documents/developer-program.md new file mode 100644 index 0000000..a19b1e8 --- /dev/null +++ b/documents/developer-program.md @@ -0,0 +1,14 @@ +--- +title: Developer Program +--- + +When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs. + +To qualify for free LBC you must: + +- have a GitHub account, and +- have a public PR (pull request) in the past year + +If this sounds like you, get started here! + +If you have not downloaded our SDK yet, [you should]() and generate a wallet address so we know where to send your LBC! diff --git a/package.json b/package.json index dd6e952..2c5c00b 100755 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "@helper": "app/helpers", "@module": "app/modules", "@root": ".", + "@socket": "app/sockets.js", "@view": "app/views" }, "author": "LBRY Team", -- 2.43.4 From bc89f59552513a4e7db9ed20287bb3ea235b9b4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Thu, 7 Feb 2019 17:06:03 -0600 Subject: [PATCH 04/14] Why is authing with GitHub so weird --- .env.sample | 4 ++ app/client.js | 1 - app/components/client/playground-scripts.js | 28 +++++++------- app/dist/scripts/app.js | 4 +- app/helpers/github.js | 21 ++++++++--- app/sockets.js | 8 ++-- app/views/dev.js | 41 --------------------- 7 files changed, 41 insertions(+), 66 deletions(-) delete mode 100644 app/views/dev.js diff --git a/.env.sample b/.env.sample index 4f36271..ccdcb8a 100644 --- a/.env.sample +++ b/.env.sample @@ -2,6 +2,10 @@ # HTTPS is assumed for security reasons DAEMON_URL= +# These are for powering the LBRY Developer Program +GITHUB_APP_ID= +GITHUB_APP_TOKEN= + # https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app # We use this to show the GitHub feed on the homepage GITHUB_OAUTH_TOKEN= diff --git a/app/client.js b/app/client.js index 9b8d032..76e4235 100755 --- a/app/client.js +++ b/app/client.js @@ -35,7 +35,6 @@ function main() { app.route("/", page(require("./views/home"))); app.route("/api/*", page(require("./views/api"))); - app.route("/dev-program", page(require("./views/dev"))); app.route("/spec", page(require("./views/spec"))); app.route("/*", page(require("./views/redirect"))); diff --git a/app/components/client/playground-scripts.js b/app/components/client/playground-scripts.js index 8b82406..db3b836 100644 --- a/app/components/client/playground-scripts.js +++ b/app/components/client/playground-scripts.js @@ -131,9 +131,9 @@ function initializePlayground() { document.querySelector("#fetch-claim-uri").focus(); document.querySelector(".playground-navigation__example:nth-child(1)").classList.add("active"); - send(JSON.stringify({ + send({ message: "landed on playground" - })); + }); setTimeout(() => { document.querySelector(".playground-navigation__example:nth-child(1)").click(); @@ -146,12 +146,12 @@ function fetchMetadata(exampleNumber, data) { switch(exampleNumber) { case 1: - send(JSON.stringify({ + send({ claim: data, message: "fetch metadata", method: "resolve", example: exampleNumber - })); + }); document.getElementById("fetch-claim-uri").value = data; document.getElementById("playground-results").innerHTML = playgroundResponseForExample1(data); @@ -159,24 +159,24 @@ function fetchMetadata(exampleNumber, data) { break; case 2: - send(JSON.stringify({ + send({ data: data, message: "fetch metadata", method: "publish", example: exampleNumber - })); + }); document.getElementById("playground-results").innerHTML = playgroundResponseForExample2(getMemeInfo()); document.getElementById("playground-loader").style.display = "none"; break; case 3: - send(JSON.stringify({ + send({ claim: data, message: "fetch metadata", method: "claim_tip", example: exampleNumber - })); + }); document.getElementById("fetch-claim-uri").value = data; document.getElementById("playground-results").innerHTML = playgroundResponseForExample3(data); @@ -279,9 +279,9 @@ const handleExamples = debounce(event => { document.getElementById("playground-loader").removeAttribute("style"); document.getElementById("playground-results").removeAttribute("style"); - send(JSON.stringify({ + send({ message: `request for ${data.action}` - })); + }); break; @@ -305,9 +305,9 @@ const handleExamples = debounce(event => { document.getElementById("playground-loader").removeAttribute("style"); document.getElementById("playground-results").removeAttribute("style"); - send(JSON.stringify({ + send({ message: `request for ${data.action}` - })); + }); break; @@ -334,9 +334,9 @@ const handleExamples = debounce(event => { document.getElementById("playground-loader").removeAttribute("style"); document.getElementById("playground-results").removeAttribute("style"); - send(JSON.stringify({ + send({ message: `request for ${data.action}` - })); + }); break; diff --git a/app/dist/scripts/app.js b/app/dist/scripts/app.js index 3dc9a18..26293d5 100755 --- a/app/dist/scripts/app.js +++ b/app/dist/scripts/app.js @@ -63,10 +63,10 @@ document.querySelector("[data-action='subscribe to newsletter']").onclick = () = document.getElementById("emailMessage").classList.remove("error"); - send(JSON.stringify({ + send({ email: email, message: "subscribe" - })); + }); }; diff --git a/app/helpers/github.js b/app/helpers/github.js index 7e6ec59..381eebb 100644 --- a/app/helpers/github.js +++ b/app/helpers/github.js @@ -336,12 +336,21 @@ function generateUrl(type, event) { } } -function getGitHubUserToken() { +async function getGitHubUserToken() { // const clientWithAuth = new Octokit({ - // auth: `token ${GITHUB_APP_TOKEN}` + // auth: `token ${process.env.GITHUB_APP_TOKEN}` // }); - // console.log(clientWithAuth); + const result = await octokit.oauthAuthorizations.createAuthorization({ // eslint-disable-line no-unused-vars + client_id: process.env.GITHUB_APP_ID, + client_secret: process.env.GITHUB_APP_TOKEN, + note: "LBRY Developer Auth", + scopes: [ + "public_repo" + ] + }); + + // console.log(result); // console.log("—————"); } @@ -355,8 +364,10 @@ function updateGithubFeed() { const eventString = JSON.stringify(item); client.zrank("events", eventString, (err, reply) => { - if (reply === null) client.zadd("events", item.id, eventString, callback); - else callback(); + if (reply === null) + client.zadd("events", item.id, eventString, callback); + else + callback(); }); }, () => client.zremrangebyrank("events", 0, -51)); // Keep the latest 50 events }) diff --git a/app/sockets.js b/app/sockets.js index f34c855..5869b13 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -10,7 +10,7 @@ import html from "choo/html"; // U T I L S import fetchMetadata from "@helper/fetch-metadata"; -import { generateGitHubFeed } from "@helper/github"; +import { generateGitHubFeed, getGitHubUserToken } from "@helper/github"; import messageSlack from "@helper/slack"; @@ -21,9 +21,11 @@ export default (socket, action) => { if (typeof socket !== "object" && typeof action !== "object") return; - action = JSON.parse(action); - switch(true) { + case action.message === "auth me with github": + getGitHubUserToken(); + break; + case action.message === "fetch metadata": fetchMetadata(action, socket); break; diff --git a/app/views/dev.js b/app/views/dev.js deleted file mode 100644 index d41a15f..0000000 --- a/app/views/dev.js +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; - - - -// I M P O R T - -import html from "choo/html"; - - - -// E X P O R T - -export default () => html` -
- - -
-
-

When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs.

-

To qualify for free LBC you must:

- -
    -
  • have a GitHub account, and
  • -
  • have a public PR (pull request) in the past year
  • -
- -

If this sounds like you, get started here!

- -

- If you have not downloaded our SDK yet, you should and generate a wallet address so we know where to send your LBC! -

-
-
-
-`; -- 2.43.4 From 48efa9da7342a9ab68ab130ac20d4964b4410acc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Mon, 11 Feb 2019 17:47:01 -0600 Subject: [PATCH 05/14] Cleaned up flow --- app/components/client/devprogram-scripts.js | 32 +++++++++++++++++++-- app/components/developer-program.js | 17 +++++++++++ app/dist/scripts/app.js | 3 +- app/dist/scripts/sockets.js | 26 ++++++++++------- app/helpers/github.js | 19 ------------ app/sass/bundle.scss | 1 + app/sass/pages/_developer.scss | 3 ++ app/sockets.js | 11 +++++-- documents/developer-program.md | 2 +- 9 files changed, 76 insertions(+), 38 deletions(-) create mode 100644 app/components/developer-program.js create mode 100644 app/sass/pages/_developer.scss diff --git a/app/components/client/devprogram-scripts.js b/app/components/client/devprogram-scripts.js index e58bdc7..822855f 100644 --- a/app/components/client/devprogram-scripts.js +++ b/app/components/client/devprogram-scripts.js @@ -1,11 +1,37 @@ -"use strict"; /* global document, send */ +"use strict"; /* global document, history, send, window */ -document.getElementById("get-started").addEventListener("click", event => { +document.getElementById("get-started").onclick = event => { event.preventDefault(); send({ message: "auth me with github" }); -}); +}; + +if (window.location.search.includes("?code=")) { + document.querySelector("developer-program").innerHTML = ` +
+ + + + + +
+ `; + + history.replaceState({}, "", window.location.pathname); // clean up URL bar +} + +if (document.getElementById("creditsAcquire")) { + document.getElementById("creditsAcquire").onclick = () => { + send({ + address: document.getElementById("walletAddress").value, + code: document.getElementById("oauthCode").value, + message: "verify github auth" + }); + + document.querySelector("developer-program").innerHTML = "

Awaiting response from internal LBRY API

"; + }; +} diff --git a/app/components/developer-program.js b/app/components/developer-program.js new file mode 100644 index 0000000..53bae6b --- /dev/null +++ b/app/components/developer-program.js @@ -0,0 +1,17 @@ +"use strict"; + + + +// I M P O R T + +import html from "choo/html"; + + + +// E X P O R T + +export default () => html` + +

If this sounds like you, get started here!

+
+`; diff --git a/app/dist/scripts/app.js b/app/dist/scripts/app.js index 26293d5..50a96f5 100755 --- a/app/dist/scripts/app.js +++ b/app/dist/scripts/app.js @@ -90,6 +90,5 @@ function scrollToElementOnLoad() { function validateEmail(email) { const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\\.,;:\s@"]{2,})$/i; - - return emailRegex.test(String(email)); + return emailRegex.test(String(email)); // eslint-disable-line padding-line-between-statements } diff --git a/app/dist/scripts/sockets.js b/app/dist/scripts/sockets.js index 1b7d302..6d5344b 100644 --- a/app/dist/scripts/sockets.js +++ b/app/dist/scripts/sockets.js @@ -1,4 +1,4 @@ -"use strict"; /* global document, location, WebSocket */ +"use strict"; /* global document, location, WebSocket, window */ @@ -25,6 +25,20 @@ function initializeWebSocketConnection() { const data = JSON.parse(socket.data); switch(true) { + case data.message === "notification": // TODO: Make work with appending so multiple notifications can be sent + document.getElementById("flash-container").innerHTML = + `
${data.details}
`; + + setTimeout(() => { + document.getElementById("flash-container").innerHTML = ""; + }, 2100); + + break; + + case data.message === "redirect": + window.location.href = data.url; + break; + case data.message === "show result": if (!data.example) return; @@ -83,16 +97,6 @@ function initializeWebSocketConnection() { break; - case data.message === "notification": // TODO: Make work with appending so multiple notifications can be sent - document.getElementById("flash-container").innerHTML = - `
${data.details}
`; - - setTimeout(() => { - document.getElementById("flash-container").innerHTML = ""; - }, 2100); - - break; - default: console.log(data); // eslint-disable-line no-console break; diff --git a/app/helpers/github.js b/app/helpers/github.js index 381eebb..b476649 100644 --- a/app/helpers/github.js +++ b/app/helpers/github.js @@ -336,24 +336,6 @@ function generateUrl(type, event) { } } -async function getGitHubUserToken() { - // const clientWithAuth = new Octokit({ - // auth: `token ${process.env.GITHUB_APP_TOKEN}` - // }); - - const result = await octokit.oauthAuthorizations.createAuthorization({ // eslint-disable-line no-unused-vars - client_id: process.env.GITHUB_APP_ID, - client_secret: process.env.GITHUB_APP_TOKEN, - note: "LBRY Developer Auth", - scopes: [ - "public_repo" - ] - }); - - // console.log(result); - // console.log("—————"); -} - function updateGithubFeed() { octokit.activity.listPublicEventsForOrg({ org: "lbryio", @@ -397,6 +379,5 @@ export { generateEvent, generateGitHubFeed, generateUrl, - getGitHubUserToken, updateGithubFeed }; diff --git a/app/sass/bundle.scss b/app/sass/bundle.scss index 08374c0..bc3f413 100755 --- a/app/sass/bundle.scss +++ b/app/sass/bundle.scss @@ -22,6 +22,7 @@ @import "pages/api"; @import "pages/contributing"; +@import "pages/developer"; @import "pages/documentation"; @import "pages/home"; @import "pages/page"; diff --git a/app/sass/pages/_developer.scss b/app/sass/pages/_developer.scss new file mode 100644 index 0000000..a22be52 --- /dev/null +++ b/app/sass/pages/_developer.scss @@ -0,0 +1,3 @@ +developer-program { + @extend %markdown; +} diff --git a/app/sockets.js b/app/sockets.js index 5869b13..bdd3c7d 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -10,7 +10,7 @@ import html from "choo/html"; // U T I L S import fetchMetadata from "@helper/fetch-metadata"; -import { generateGitHubFeed, getGitHubUserToken } from "@helper/github"; +import { generateGitHubFeed } from "@helper/github"; import messageSlack from "@helper/slack"; @@ -23,7 +23,7 @@ export default (socket, action) => { switch(true) { case action.message === "auth me with github": - getGitHubUserToken(); + getGitHubUserToken(socket); break; case action.message === "fetch metadata": @@ -332,6 +332,13 @@ function generateMemeCreator(socket) { }); } +function getGitHubUserToken(socket) { + send(socket, { + message: "redirect", + url: `https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_APP_ID}` + }); +} + async function getTrendingContent() { try { const response = await got("https://api.lbry.io/file/list_trending"); diff --git a/documents/developer-program.md b/documents/developer-program.md index a19b1e8..a031f65 100644 --- a/documents/developer-program.md +++ b/documents/developer-program.md @@ -9,6 +9,6 @@ To qualify for free LBC you must: - have a GitHub account, and - have a public PR (pull request) in the past year -If this sounds like you, get started here! + If you have not downloaded our SDK yet, [you should]() and generate a wallet address so we know where to send your LBC! -- 2.43.4 From 6bddcc8ff24ee81247add1d80e37aad279b0d443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Wed, 13 Feb 2019 17:08:59 -0600 Subject: [PATCH 06/14] Nearly there! --- .env.sample | 4 +++- app/dist/scripts/sockets.js | 2 +- app/sockets.js | 40 ++++++++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/.env.sample b/.env.sample index ccdcb8a..abf2af3 100644 --- a/.env.sample +++ b/.env.sample @@ -3,8 +3,10 @@ DAEMON_URL= # These are for powering the LBRY Developer Program +DEV_PROGRAM_OAUTH= GITHUB_APP_ID= -GITHUB_APP_TOKEN= +REWARD_URL= +REWARD_URL_TEST= # https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app # We use this to show the GitHub feed on the homepage diff --git a/app/dist/scripts/sockets.js b/app/dist/scripts/sockets.js index 6d5344b..3e236a2 100644 --- a/app/dist/scripts/sockets.js +++ b/app/dist/scripts/sockets.js @@ -19,7 +19,7 @@ function checkWebSocketConnection() { function initializeWebSocketConnection() { ws = new WebSocket(location.origin.replace(/^http/, "ws")); - ws.onopen = () => console.log("WebSocket connection established"); // eslint-disable-line + // ws.onopen = () => console.log("WebSocket connection established"); // eslint-disable-line no-console ws.onmessage = socket => { const data = JSON.parse(socket.data); diff --git a/app/sockets.js b/app/sockets.js index bdd3c7d..7afbedc 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -13,10 +13,44 @@ import fetchMetadata from "@helper/fetch-metadata"; import { generateGitHubFeed } from "@helper/github"; import messageSlack from "@helper/slack"; +const apiUrl = process.env.NODE_ENV === "development" ? + process.env.REWARD_URL_TEST : + process.env.REWARD_URL; + // P R O G R A M +async function syncWithApi(data, socket) { + try { + let result = await got(`https://${apiUrl}/reward/new?github_token=${process.env.DEV_PROGRAM_OAUTH}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); + + result = result.body.data; + + return send(socket, { + html: `

Success! Your wallet has been credited with ${result.reward_amount} LBC.

`, + message: "updated html", + selector: "developer-program" + }); + } catch(error) { + if (!error.body) { + return send(socket, { + html: "

LBRY API is down. Please try again later.

", + message: "updated html", + selector: "developer-program" + }); + } + + console.log(error.body); // eslint-disable-line no-console + + return send(socket, { + html: "

This reward is limited to ONE per person. Your enthusiasm is appreciated.

", + message: "updated html", + selector: "developer-program" + }); + } +} + export default (socket, action) => { if (typeof socket !== "object" && typeof action !== "object") return; @@ -26,6 +60,10 @@ export default (socket, action) => { getGitHubUserToken(socket); break; + case action.message === "verify github auth": + syncWithApi(action, socket); + break; + case action.message === "fetch metadata": fetchMetadata(action, socket); break; @@ -335,7 +373,7 @@ function generateMemeCreator(socket) { function getGitHubUserToken(socket) { send(socket, { message: "redirect", - url: `https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_APP_ID}` + url: `https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_APP_ID}&scope=public_repo,user:email` }); } -- 2.43.4 From 6e31652e4d8f924fe1ffba1d92d1a3a43c9867fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Wed, 13 Feb 2019 17:30:04 -0600 Subject: [PATCH 07/14] Note --- app/sockets.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/sockets.js b/app/sockets.js index 7afbedc..ce4ac1c 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -25,6 +25,8 @@ async function syncWithApi(data, socket) { try { let result = await got(`https://${apiUrl}/reward/new?github_token=${process.env.DEV_PROGRAM_OAUTH}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); + // let result = await got(`https://${apiUrl}/reward/new?github_token=${data.code}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); // This SHOULD work but does not. `data.code` is what is received from GitHub when the developer is redirected back to .tech. + result = result.body.data; return send(socket, { -- 2.43.4 From 6a88c450ac84fea64364001ed1a76f55b14dc22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Thu, 14 Feb 2019 11:07:22 -0600 Subject: [PATCH 08/14] FIN --- .env.sample | 7 +++- app/sockets.js | 94 ++++++++++++++++++++++++++++++++------------------ package.json | 4 +-- 3 files changed, 69 insertions(+), 36 deletions(-) diff --git a/.env.sample b/.env.sample index abf2af3..e678ba4 100644 --- a/.env.sample +++ b/.env.sample @@ -3,8 +3,13 @@ DAEMON_URL= # These are for powering the LBRY Developer Program -DEV_PROGRAM_OAUTH= +# /developer-program GITHUB_APP_ID= +GITHUB_APP_SECRET= + +GITHUB_APP_ID_TEST= +GITHUB_APP_SECRET_TEST= + REWARD_URL= REWARD_URL_TEST= diff --git a/app/sockets.js b/app/sockets.js index ce4ac1c..bf309b8 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -17,42 +17,18 @@ const apiUrl = process.env.NODE_ENV === "development" ? process.env.REWARD_URL_TEST : process.env.REWARD_URL; +const githubAppId = process.env.NODE_ENV === "development" ? + process.env.GITHUB_APP_ID_TEST : + process.env.GITHUB_APP_ID; + +const githubAppSecret = process.env.NODE_ENV === "development" ? + process.env.GITHUB_APP_SECRET_TEST : + process.env.GITHUB_APP_SECRET; + // P R O G R A M -async function syncWithApi(data, socket) { - try { - let result = await got(`https://${apiUrl}/reward/new?github_token=${process.env.DEV_PROGRAM_OAUTH}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); - - // let result = await got(`https://${apiUrl}/reward/new?github_token=${data.code}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); // This SHOULD work but does not. `data.code` is what is received from GitHub when the developer is redirected back to .tech. - - result = result.body.data; - - return send(socket, { - html: `

Success! Your wallet has been credited with ${result.reward_amount} LBC.

`, - message: "updated html", - selector: "developer-program" - }); - } catch(error) { - if (!error.body) { - return send(socket, { - html: "

LBRY API is down. Please try again later.

", - message: "updated html", - selector: "developer-program" - }); - } - - console.log(error.body); // eslint-disable-line no-console - - return send(socket, { - html: "

This reward is limited to ONE per person. Your enthusiasm is appreciated.

", - message: "updated html", - selector: "developer-program" - }); - } -} - export default (socket, action) => { if (typeof socket !== "object" && typeof action !== "object") return; @@ -375,7 +351,7 @@ function generateMemeCreator(socket) { function getGitHubUserToken(socket) { send(socket, { message: "redirect", - url: `https://github.com/login/oauth/authorize?client_id=${process.env.GITHUB_APP_ID}&scope=public_repo,user:email` + url: `https://github.com/login/oauth/authorize?client_id=${githubAppId}&scope=public_repo,user:email` }); } @@ -454,7 +430,59 @@ export function send(transport, data) { return transport.send(JSON.stringify(data)); } +async function syncWithApi(data, socket) { + const tokenResponse = await verifyGitHubToken(data.code); + + if (tokenResponse === null) { + return send(socket, { + html: "

There was an issue with accessing GitHub's API. Please try again later.

", + message: "updated html", + selector: "developer-program" + }); + } + + try { + let result = await got(`https://${apiUrl}/reward/new?github_token=${tokenResponse}&reward_type=github_developer&wallet_address=${data.address}`, { json: true }); + + result = result.body.data; + + return send(socket, { + html: `

Success! Your wallet has been credited with ${result.reward_amount} LBC.

We have a great reference for the LBRY SDK here to help you get started.

`, + message: "updated html", + selector: "developer-program" + }); + } catch(error) { + if (!error.body) { + return send(socket, { + html: "

LBRY API is down. Please try again later.

", + message: "updated html", + selector: "developer-program" + }); + } + + console.log(error.body); // eslint-disable-line no-console + + return send(socket, { + html: "

This reward is limited to ONE per person. Your enthusiasm is appreciated.

", + message: "updated html", + selector: "developer-program" + }); + } +} + function validateEmail(email) { const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([^<>()[\].,;:\s@"]+\.)+[^<>()[\\.,;:\s@"]{2,})$/i; return emailRegex.test(String(email)); // eslint-disable-line padding-line-between-statements } + +async function verifyGitHubToken(code) { + try { + let result = await got.post(`https://github.com/login/oauth/access_token?client_id=${githubAppId}&client_secret=${githubAppSecret}&code=${code}`, { json: true }); + + result = result.body; + return result.access_token; + } catch(verificationError) { + console.log(verificationError.body); // eslint-disable-line no-console + return null; + } +} diff --git a/package.json b/package.json index 2c5c00b..7a45bdd 100755 --- a/package.json +++ b/package.json @@ -95,8 +95,8 @@ "css": "sass --load-path=node_modules --update app/sass:app/dist --style compressed", "format": "eslint '**/*.js' --fix --ignore-pattern '/app/dist/'", "postinstall": "link-module-alias", - "preinstall": "command -v link-module-alias && link-module-alias clean || true", - "start": "npm run css && npm i && NODE_ENV=production node index.js", + "preinstall": "command -v link-module-alias; link-module-alias clean || true", + "start": "npm run css; npm i; NODE_ENV=production node index.js", "test": "run-s test:*", "test:dependencies": "updates --update ./ --exclude fastify,prismjs", "test:lint": "standardx --verbose | snazzy", -- 2.43.4 From 0e56f29eaf0028d20a21cebcd904a7341e449c3e Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Sun, 17 Feb 2019 16:10:53 -0500 Subject: [PATCH 09/14] copy changes and env check fix --- app/helpers/github.js | 6 +++--- app/sass/init/_markdown.scss | 2 +- documents/developer-program.md | 16 +++++++++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/helpers/github.js b/app/helpers/github.js index b476649..6add98a 100644 --- a/app/helpers/github.js +++ b/app/helpers/github.js @@ -30,13 +30,13 @@ String.prototype.escape = function() { let client; -if (typeof process.env.GITHUB_OAUTH_TOKEN !== "undefined") { +if (process.env.GITHUB_OAUTH_TOKEN) { octokit = new Octokit({ auth: `token ${process.env.GITHUB_OAUTH_TOKEN}` }); } else process.stdout.write(`${color.red("[missing]")} GitHub token`); -if (typeof process.env.REDISCLOUD_URL !== "undefined") { +if (process.env.REDISCLOUD_URL) { client = redis.createClient(process.env.REDISCLOUD_URL); client.on("error", redisError => { @@ -258,7 +258,7 @@ function generateEvent(event) { } function generateGitHubFeed(displayGitHubFeed) { - if (typeof process.env.REDISCLOUD_URL !== "undefined") { + if (process.env.REDISCLOUD_URL) { client.zrevrange("events", 0, 9, (err, reply) => { if (err) return; // TODO: Render a div with nice error message diff --git a/app/sass/init/_markdown.scss b/app/sass/init/_markdown.scss index 910bd36..0a9394b 100644 --- a/app/sass/init/_markdown.scss +++ b/app/sass/init/_markdown.scss @@ -164,7 +164,7 @@ padding-left: 0.1rem; li { - list-style-type: lower-roman; + list-style-type: decimal; } } diff --git a/documents/developer-program.md b/documents/developer-program.md index a031f65..435e80c 100644 --- a/documents/developer-program.md +++ b/documents/developer-program.md @@ -2,13 +2,19 @@ title: Developer Program --- -When developing for LBRY, having LBC (LBRY credits) makes it easier to develop applications and interface with our APIs. +LBRY offers a complimentary 100 LBC to qualified engineers to facilitate exploration, development, and testing. -To qualify for free LBC you must: +To qualify you must: -- have a GitHub account, and -- have a public PR (pull request) in the past year +- Have a GitHub account prior to January 1st, 2018. +- Have made a public pull request within the past year. -If you have not downloaded our SDK yet, [you should]() and generate a wallet address so we know where to send your LBC! +(below here should be hidden until click) + +To receive your LBC, you'll need a wallet address. While graphical wallets are available, the recommended path for engineers is to: + +1. Download [the LBRY SDK](https://github/lbryio/lbry). +1. Launch the command-line utility. +1. Run the [`address_unused`](https://lbry.tech/api/sdk#address_unused) command. -- 2.43.4 From 18a0a71594b747db27e9aade474d21110daf86fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Mon, 18 Feb 2019 14:31:48 -0600 Subject: [PATCH 10/14] Fixes --- .env.sample | 5 ----- app/components/client/devprogram-scripts.js | 8 +++++++ app/components/developer-program.js | 25 ++++++++++++++++----- app/dist/scripts/api.js | 11 +++------ app/sass/pages/_developer.scss | 11 +++++++++ app/sockets.js | 18 +++++++-------- documents/developer-program.md | 8 ------- 7 files changed, 50 insertions(+), 36 deletions(-) diff --git a/.env.sample b/.env.sample index e678ba4..ad58247 100644 --- a/.env.sample +++ b/.env.sample @@ -6,12 +6,7 @@ DAEMON_URL= # /developer-program GITHUB_APP_ID= GITHUB_APP_SECRET= - -GITHUB_APP_ID_TEST= -GITHUB_APP_SECRET_TEST= - REWARD_URL= -REWARD_URL_TEST= # https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app # We use this to show the GitHub feed on the homepage diff --git a/app/components/client/devprogram-scripts.js b/app/components/client/devprogram-scripts.js index 822855f..da03f97 100644 --- a/app/components/client/devprogram-scripts.js +++ b/app/components/client/devprogram-scripts.js @@ -19,6 +19,14 @@ if (window.location.search.includes("?code=")) { + +

To receive your LBC, you'll need a wallet address. While graphical wallets are available, the recommended path for engineers is to:

+ +
    +
  1. Download the LBRY SDK.
  2. +
  3. Launch the command-line utility.
  4. +
  5. Run the address_unused command.
  6. +
`; history.replaceState({}, "", window.location.pathname); // clean up URL bar diff --git a/app/components/developer-program.js b/app/components/developer-program.js index 53bae6b..c69085f 100644 --- a/app/components/developer-program.js +++ b/app/components/developer-program.js @@ -10,8 +10,23 @@ import html from "choo/html"; // E X P O R T -export default () => html` - -

If this sounds like you, get started here!

-
-`; +export default () => { + if ( + !process.env.GITHUB_APP_ID || + !process.env.GITHUB_APP_SECRET || + !process.env.REWARD_URL + ) { + return html` + +

Environment variables required to enable functionality are missing.

+
+ `; + } + + return html` + + + This will authenticate you with GitHub to prove eligibility as well as mark you as a follower of LBRY. + + `; +}; diff --git a/app/dist/scripts/api.js b/app/dist/scripts/api.js index bb6f8d2..f9869a7 100644 --- a/app/dist/scripts/api.js +++ b/app/dist/scripts/api.js @@ -45,14 +45,9 @@ function handleApiLanguageToggles(language) { const examples = document.querySelectorAll("[data-api-example-type]"); const toggles = document.querySelectorAll("*[id^='toggle-']"); - for (const example of examples) - example.classList.remove("active"); - - for (const example of codeExamples) - example.classList.add("active"); - - for (const toggle of toggles) - toggle.classList.remove("active"); + examples.forEach(example => example.classList.remove("active")); + codeExamples.forEach(example => example.classList.add("active")); + toggles.forEach(example => example.classList.remove("active")); document.getElementById(`toggle-${language}`).classList.add("active"); }); diff --git a/app/sass/pages/_developer.scss b/app/sass/pages/_developer.scss index a22be52..661b663 100644 --- a/app/sass/pages/_developer.scss +++ b/app/sass/pages/_developer.scss @@ -1,3 +1,14 @@ developer-program { @extend %markdown; + + .button { + margin: 2rem auto 1rem; + display: block; + } + + small { + display: block; + font-size: 0.8rem; + text-align: center; + } } diff --git a/app/sockets.js b/app/sockets.js index bf309b8..f18bc32 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -13,17 +13,15 @@ import fetchMetadata from "@helper/fetch-metadata"; import { generateGitHubFeed } from "@helper/github"; import messageSlack from "@helper/slack"; -const apiUrl = process.env.NODE_ENV === "development" ? - process.env.REWARD_URL_TEST : - process.env.REWARD_URL; +let apiUrl = process.env.REWARD_URL; +let githubAppId = process.env.GITHUB_APP_ID; +let githubAppSecret = process.env.GITHUB_APP_SECRET; -const githubAppId = process.env.NODE_ENV === "development" ? - process.env.GITHUB_APP_ID_TEST : - process.env.GITHUB_APP_ID; - -const githubAppSecret = process.env.NODE_ENV === "development" ? - process.env.GITHUB_APP_SECRET_TEST : - process.env.GITHUB_APP_SECRET; +if (process.env.NODE_ENV === "development") { + apiUrl = process.env.REWARD_URL_TEST; + githubAppId = process.env.GITHUB_APP_ID_TEST; + githubAppSecret = process.env.GITHUB_APP_SECRET_TEST; +} diff --git a/documents/developer-program.md b/documents/developer-program.md index 435e80c..fa8102b 100644 --- a/documents/developer-program.md +++ b/documents/developer-program.md @@ -10,11 +10,3 @@ To qualify you must: - Have made a public pull request within the past year. - -(below here should be hidden until click) - -To receive your LBC, you'll need a wallet address. While graphical wallets are available, the recommended path for engineers is to: - -1. Download [the LBRY SDK](https://github/lbryio/lbry). -1. Launch the command-line utility. -1. Run the [`address_unused`](https://lbry.tech/api/sdk#address_unused) command. -- 2.43.4 From bcd13e14bb63cd51a9ee75767e3a20e175ec46db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Mon, 18 Feb 2019 14:59:27 -0600 Subject: [PATCH 11/14] Fixes --- app/views/redirect.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/views/redirect.js b/app/views/redirect.js index 808bf53..42d3c77 100644 --- a/app/views/redirect.js +++ b/app/views/redirect.js @@ -30,6 +30,8 @@ export default (state, emit) => { // eslint-disable-line const markdownFile = fs.readFileSync(path, "utf-8"); const markdownFileDetails = fm(markdownFile); + const title = markdownFileDetails.attributes.title; + const description = markdownFileDetails.attributes.description || ""; if (markdownFileDetails.attributes.meta) { const customMetadata = {}; @@ -41,10 +43,16 @@ export default (state, emit) => { // eslint-disable-line } } - // below seems evil state.lbry = customMetadata; } + // below is evil, I just inherited it -- Jeremy + state.lbry = { + title: title, + description: description + }; + + // below should be refactored into components let pageScript = ""; switch(true) { -- 2.43.4 From d323a16d1d6b4c1d5f31969f747d532b61a48b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Mon, 18 Feb 2019 17:28:50 -0600 Subject: [PATCH 12/14] Playground uses same component HTML as Developer Program --- app/components/client/playground-scripts.js | 12 +++--------- app/components/playground.js | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/app/components/client/playground-scripts.js b/app/components/client/playground-scripts.js index db3b836..7a17f9f 100644 --- a/app/components/client/playground-scripts.js +++ b/app/components/client/playground-scripts.js @@ -268,9 +268,7 @@ const handleExamples = debounce(event => { if (document.getElementById("playground-url").style.display === "none") document.getElementById("playground-url").removeAttribute("style"); - for (const example of document.querySelectorAll(".playground-navigation__example")) - example.classList.remove("active"); - + document.querySelectorAll(".playground-navigation__example").forEach(example => example.classList.remove("active")); document.querySelector(".playground-navigation__example:nth-child(1)").classList.add("active"); document.getElementById("playground-loader").innerHTML = ""; @@ -294,9 +292,7 @@ const handleExamples = debounce(event => { document.getElementById("fetch-claim-uri").value = ""; // reset URL bar document.getElementById("playground-url").style.display = "none"; - for (const example of document.querySelectorAll(".playground-navigation__example")) - example.classList.remove("active"); - + document.querySelectorAll(".playground-navigation__example").forEach(example => example.classList.remove("active")); document.querySelector(".playground-navigation__example:nth-child(2)").classList.add("active"); document.getElementById("playground-loader").innerHTML = ""; @@ -323,9 +319,7 @@ const handleExamples = debounce(event => { if (document.getElementById("playground-url").style.display === "none") document.getElementById("playground-url").removeAttribute("style"); - for (const example of document.querySelectorAll(".playground-navigation__example")) - example.classList.remove("active"); - + document.querySelectorAll(".playground-navigation__example").forEach(example => example.classList.remove("active")); document.querySelector(".playground-navigation__example:nth-child(3)").classList.add("active"); document.getElementById("playground-loader").innerHTML = ""; diff --git a/app/components/playground.js b/app/components/playground.js index c4463a3..f0a60d7 100644 --- a/app/components/playground.js +++ b/app/components/playground.js @@ -28,10 +28,10 @@ export default () => dedent` function example1() { return html` -
+ lbry:// -
+
-- 2.43.4 From 2400b5c46523db515e92e793fc2f252a70634a6a Mon Sep 17 00:00:00 2001 From: Jeremy Kauffman Date: Tue, 19 Feb 2019 13:17:32 -0500 Subject: [PATCH 13/14] copy changes --- .env.sample | 2 +- app/components/client/devprogram-scripts.js | 9 +++++---- app/sass/pages/_developer.scss | 2 +- app/sockets.js | 10 +--------- documents/developer-program.md | 1 + 5 files changed, 9 insertions(+), 15 deletions(-) diff --git a/.env.sample b/.env.sample index ad58247..eb522f4 100644 --- a/.env.sample +++ b/.env.sample @@ -6,7 +6,7 @@ DAEMON_URL= # /developer-program GITHUB_APP_ID= GITHUB_APP_SECRET= -REWARD_URL= +REWARD_URL=api.lbry.io # https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app # We use this to show the GitHub feed on the homepage diff --git a/app/components/client/devprogram-scripts.js b/app/components/client/devprogram-scripts.js index da03f97..0017425 100644 --- a/app/components/client/devprogram-scripts.js +++ b/app/components/client/devprogram-scripts.js @@ -20,12 +20,13 @@ if (window.location.search.includes("?code=")) { +

Need An Address?

To receive your LBC, you'll need a wallet address. While graphical wallets are available, the recommended path for engineers is to:

    -
  1. Download the LBRY SDK.
  2. -
  3. Launch the command-line utility.
  4. -
  5. Run the address_unused command.
  6. +
  7. Download the LBRY SDK.
  8. +
  9. Launch the command-line utility (./lbrynet start).
  10. +
  11. Run ./lbrynet address list and copy the id field.
`; @@ -40,6 +41,6 @@ if (document.getElementById("creditsAcquire")) { message: "verify github auth" }); - document.querySelector("developer-program").innerHTML = "

Awaiting response from internal LBRY API

"; + document.querySelector("developer-program").innerHTML = "

Awaiting response from LBRY server...

"; }; } diff --git a/app/sass/pages/_developer.scss b/app/sass/pages/_developer.scss index 661b663..cd23817 100644 --- a/app/sass/pages/_developer.scss +++ b/app/sass/pages/_developer.scss @@ -2,7 +2,7 @@ developer-program { @extend %markdown; .button { - margin: 2rem auto 1rem; + margin: 1rem auto; display: block; } diff --git a/app/sockets.js b/app/sockets.js index f18bc32..b2258e7 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -17,14 +17,6 @@ let apiUrl = process.env.REWARD_URL; let githubAppId = process.env.GITHUB_APP_ID; let githubAppSecret = process.env.GITHUB_APP_SECRET; -if (process.env.NODE_ENV === "development") { - apiUrl = process.env.REWARD_URL_TEST; - githubAppId = process.env.GITHUB_APP_ID_TEST; - githubAppSecret = process.env.GITHUB_APP_SECRET_TEST; -} - - - // P R O G R A M export default (socket, action) => { @@ -461,7 +453,7 @@ async function syncWithApi(data, socket) { console.log(error.body); // eslint-disable-line no-console return send(socket, { - html: "

This reward is limited to ONE per person. Your enthusiasm is appreciated.

", + html: "

You have already claimed this reward. This reward is limited to ONE per person. Your enthusiasm is appreciated.

", message: "updated html", selector: "developer-program" }); diff --git a/documents/developer-program.md b/documents/developer-program.md index fa8102b..d34f13a 100644 --- a/documents/developer-program.md +++ b/documents/developer-program.md @@ -9,4 +9,5 @@ To qualify you must: - Have a GitHub account prior to January 1st, 2018. - Have made a public pull request within the past year. +### Claim LBC -- 2.43.4 From 07f3d56c719dfa16cb329a8c77269b208a574444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=9D=E3=83=BC=E3=83=AB=20=E3=82=A6=E3=82=A7=E3=83=83?= =?UTF-8?q?=E3=83=96?= Date: Tue, 19 Feb 2019 16:19:05 -0600 Subject: [PATCH 14/14] Added link to explorer in dev program response --- app/sockets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/sockets.js b/app/sockets.js index b2258e7..502e264 100644 --- a/app/sockets.js +++ b/app/sockets.js @@ -437,7 +437,7 @@ async function syncWithApi(data, socket) { result = result.body.data; return send(socket, { - html: `

Success! Your wallet has been credited with ${result.reward_amount} LBC.

We have a great reference for the LBRY SDK here to help you get started.

`, + html: `

Success! Your wallet has been credited with ${result.reward_amount} LBC.

We have a great reference for the LBRY SDK here to help you get started.

You can see proof of this transaction on our Blockain Explorer.

`, message: "updated html", selector: "developer-program" }); -- 2.43.4