Skip to content

Commit

Permalink
Proposes alternative tipping logic
Browse files Browse the repository at this point in the history
Addresses #100
  • Loading branch information
jonathansampson committed Sep 27, 2023
1 parent f0079ae commit 2b7f4c4
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 82 deletions.
139 changes: 57 additions & 82 deletions scripts/brave_rewards/publisher/twitter/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,101 +2,76 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */

import { getPort } from '../common/messaging'
import { getAuthHeaders, hasRequiredAuthHeaders } from './auth'
import * as types from "./types";

import * as types from './types'
let cachedXStore: any | null = null;

let lastRequestTime = 0
const getXState = () => {
if (cachedXStore) {
return cachedXStore.getState();
}

const sendAPIRequest = (name: string, url: string) => {
return new Promise((resolve, reject) => {
if (!name || !url) {
reject(new Error('Invalid parameters'))
return
}
const hostNode = document.querySelector("#react-root > div > div");
const descriptors = Object.getOwnPropertyDescriptors(hostNode || {});

if (!hasRequiredAuthHeaders()) {
reject(new Error('Missing auth headers'))
return
if (hostNode) {
for (const propertyName in descriptors) {
if (propertyName.startsWith("__reactProps$")) {
const reactProps = hostNode[propertyName];
const store = reactProps?.children?.props?.store;
if (store) {
cachedXStore = store;
return cachedXStore.getState();
}
}
}
}

const port = getPort()
if (!port) {
reject(new Error('Invalid port'))
return
}
throw new Error("XStore initialization failed");
};

if ((lastRequestTime !== 0) && (Date.now() - lastRequestTime < 3000)) {
reject(new Error('Ignoring API request due to network throttle'))
return
}
const getEntities = () => getXState().entities;

lastRequestTime = Date.now()
export const getTweetDetails = (tweetId: string): types.TweetDetails => {
if (!tweetId) {
throw new Error("Invalid parameters");
}

const authHeaders = getAuthHeaders()
port.postMessage({
type: 'OnAPIRequest',
mediaType: types.mediaType,
data: {
name,
url,
init: {
credentials: 'include',
headers: {
...authHeaders
},
referrerPolicy: 'no-referrer-when-downgrade',
method: 'GET',
redirect: 'follow'
}
}
})
const entities = getEntities();
const tweet = entities.tweets.entities[tweetId];
const tweetUser = entities.users.entities[tweet.user];

port.onMessage.addListener(function onMessageListener (msg: any) {
if (!port) {
reject(new Error('Invalid port'))
return
}
if (!msg || !msg.data) {
port.onMessage.removeListener(onMessageListener)
reject(new Error('Invalid message'))
return
}
if (msg.type === 'OnAPIResponse') {
if (!msg.data.name || (!msg.data.response && !msg.data.error)) {
port.onMessage.removeListener(onMessageListener)
reject(new Error('Invalid message'))
return
}
if (msg.data.name === name) {
port.onMessage.removeListener(onMessageListener)
if (msg.data.error) {
reject(new Error(msg.data.error))
return
}
resolve(msg.data.response)
}
}
})
})
}
return {
user: {
id_str: tweetUser.id_str,
screen_name: tweetUser.screen_name,
name: tweetUser.name,
profile_image_url_https: tweetUser.profile_image_url_https,
},
created_at: tweet.created_at,
text: tweet.text,
};
};

export const getTweetDetails = async (tweetId: string) => {
if (!tweetId) {
return Promise.reject(new Error('Invalid parameters'))
export const getUserDetails = (screenName: string): types.UserDetails => {
if (!screenName) {
throw new Error("Invalid parameters");
}

const url = `https://api.twitter.com/1.1/statuses/show.json?id=${tweetId}`
return sendAPIRequest('GetTweetDetails', url)
}
let user;
const users = getEntities().users.entities;

export const getUserDetails = async (screenName: string) => {
if (!screenName) {
return Promise.reject(new Error('Invalid parameters'))
for (const value of Object.values(users) as any[]) {
const nameLowered = value.screen_name.toLowerCase();
const screenNameLowered = screenName.toLowerCase();
if (nameLowered === screenNameLowered) {
user = value;
break;
}
}

const url =
`https://api.twitter.com/1.1/users/show.json?screen_name=${screenName}`
return sendAPIRequest('GetUserDetails', url)
}
return {
id_str: user.id_str,
profile_image_url_https: user.profile_image_url_https,
};
};
16 changes: 16 additions & 0 deletions scripts/brave_rewards/publisher/twitter/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,19 @@ export const mediaDomain = 'twitter.com'

export const sendHeadersUrls = ['https://api.twitter.com/1.1/*']
export const sendHeadersExtra = ['requestHeaders', 'extraHeaders']

export type TweetDetails = {
user: {
id_str: string
screen_name: string
name: string
profile_image_url_https: string
}
created_at: string
text: string
}

export type UserDetails = {
id_str: string
profile_image_url_https: string
}

0 comments on commit 2b7f4c4

Please sign in to comment.