Skip to content
This repository has been archived by the owner on May 21, 2022. It is now read-only.

Headless token refresh #30

Merged
merged 2 commits into from
Apr 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
68 changes: 55 additions & 13 deletions bot.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,29 @@ import fetch from 'node-fetch';
import getPixels from "get-pixels";
import WebSocket from 'ws';

const VERSION_NUMBER = 2;
const VERSION_NUMBER = 3;

console.log(`PlaceNL headless client V${VERSION_NUMBER}`);

KalleStruik marked this conversation as resolved.
Show resolved Hide resolved
const args = process.argv.slice(2);

if (args.length != 1 && !process.env.ACCESS_TOKEN) {
console.error("Missing access token.")
//if (args.length != 1 && !process.env.ACCESS_TOKEN) {
// console.error("Missing access token.")
// process.exit(1);
//}
if (args.length != 1 && !process.env.REDDIT_SESSION) {
console.error("Missing reddit_session cookie.")
process.exit(1);
}

let accessTokens = (process.env.ACCESS_TOKEN || args[0]).split(',');
let defaultAccessToken = accessTokens[0];
let redditSessionCookies = (process.env.REDDIT_SESSION || args[0]).split(';');

if (accessTokens.length > 4) {
var hasTokens = false;

let accessTokens;
let defaultAccessToken;

if (redditSessionCookies.length > 4) {
console.warn("Meer dan 4 reddit accounts per IP addres wordt niet geadviseerd!")
}

Expand Down Expand Up @@ -83,7 +91,22 @@ let getPendingWork = (work, rgbaOrder, rgbaCanvas) => {
};

(async function () {
connectSocket();
refreshTokens();
connectSocket();

startPlacement();

setInterval(() => {
if (socket) socket.send(JSON.stringify({ type: 'ping' }));
}, 5000);
})();

function startPlacement() {
if (!hasTokens) {
// Probeer over een seconde opnieuw.
setTimeout(startPlacement, 1000);
return
}

// Try to stagger pixel placement
const interval = 300 / accessTokens.length;
Expand All @@ -92,11 +115,32 @@ let getPendingWork = (work, rgbaOrder, rgbaCanvas) => {
setTimeout(() => attemptPlace(accessToken), delay * 1000);
delay += interval;
}
}

setInterval(() => {
if (socket) socket.send(JSON.stringify({ type: 'ping' }));
}, 5000);
})();
async function refreshTokens() {
let tokens = [];
for (const cookie of redditSessionCookies) {
const response = await fetch("https://www.reddit.com/r/place/", {
headers: {
cookie: `reddit_session=${cookie}`
}
});
const responseText = await response.text()

let token = responseText.split('\"accessToken\":\"')[1].split('"')[0];
tokens.push(token);
}

console.log("Refreshed tokens: ", tokens)

accessTokens = tokens;
defaultAccessToken = tokens[0]

// Refresh de tokens elke 30 minuten. Moet genoeg zijn toch.
setInterval(refreshTokens, 30 * 60 * 1000);

hasTokens = true;
}

function connectSocket() {
console.log('Verbinden met PlaceNL server...')
Expand Down Expand Up @@ -203,7 +247,6 @@ async function attemptPlace(accessToken) {

function place(x, y, color, accessToken = defaultAccessToken) {
socket.send(JSON.stringify({ type: 'placepixel', x, y, color }));
console.log("Placing pixel at (" + x + ", " + y + ") with color: " + color)
return fetch('https://gql-realtime-2.reddit.com/query', {
method: 'POST',
body: JSON.stringify({
Expand Down Expand Up @@ -298,7 +341,6 @@ function getMapFromUrl(url) {
reject()
return
}
console.log("got pixels", pixels.shape.slice())
resolve(pixels)
})
});
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.