soiz1's picture
Upload 811 files
30c32c8 verified
raw
history blame
9.25 kB
const formatMessage = require('format-message');
const BlockType = require('../../extension-support/block-type');
const ArgumentType = require('../../extension-support/argument-type');
const AHHHHHHHHHHHHHH = require('../../util/array buffer');
const BufferStuff = new AHHHHHHHHHHHHHH();
// const Cast = require('../../util/cast');
/**
* Class for Website Request blocks
* @constructor
*/
class JgWebsiteRequestBlocks {
constructor (runtime) {
/**
* The runtime instantiating this block package.
* @type {Runtime}
*/
this.runtime = runtime;
}
/**
* @returns {object} metadata for this extension and its blocks.
*/
getInfo () {
return {
id: 'jgWebsiteRequests',
name: 'Website Requests',
color1: '#004299',
color2: '#003478',
blocks: [
{
opcode: 'encodeTextForURL',
text: formatMessage({
id: 'jgWebsiteRequests.blocks.encodeTextForURL',
default: 'encode [TEXT] for URL',
description: 'Encodes text to be usable in a URL.'
}),
disableMonitor: true,
blockType: BlockType.REPORTER,
arguments: {
TEXT: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.text_encode_for_url',
default: 'Text here',
description: 'The text to encode.'
})
}
}
},
{
opcode: 'decodeUrlForText',
text: formatMessage({
id: 'jgWebsiteRequests.blocks.decodeUrlForText',
default: 'decode [TEXT] for text',
description: 'Decodes text used in query parameters and other areas.'
}),
disableMonitor: true,
blockType: BlockType.REPORTER,
arguments: {
TEXT: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.text_decode_for_url',
default: 'Text%20here',
description: 'The text to decode.'
})
}
}
},
{
opcode: 'getWebsiteContent',
text: formatMessage({
id: 'jgWebsiteRequests.blocks.getWebsiteContent',
default: 'get [WEBSITE]\'s content',
description: 'Gets the contents of the specified website. Includes HTML if it\'s a normal website.'
}),
disableMonitor: true,
blockType: BlockType.REPORTER,
arguments: {
WEBSITE: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.website_fetch_content',
default: 'https://www.google.com',
description: 'The website to get the content of.'
})
}
}
},
{
opcode: 'getWebsiteBinaryData',
text: formatMessage({
id: 'jgWebsiteRequests.blocks.getWebsiteBinaryData',
default: 'get binary data from [WEBSITE]',
description: 'Gets the data of the specified website.'
}),
disableMonitor: true,
blockType: BlockType.REPORTER,
arguments: {
WEBSITE: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.website_fetch_content',
default: 'https://www.google.com',
description: 'The website to get the content of.'
})
}
}
},
{
opcode: 'postWithContentToWebsite',
text: formatMessage({
id: 'jgWebsiteRequests.blocks.postWithContentToWebsite',
default: 'post [CONTENT] as [KEY] to [WEBSITE]',
description: 'Posts to a website using a JSON body with the key text set to the content.'
}),
disableMonitor: true,
blockType: BlockType.REPORTER,
arguments: {
CONTENT: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.website_post_content',
default: 'value',
description: 'The content of the key to post.'
})
},
KEY: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.website_post_key',
default: 'key',
description: 'The key in the request body to post.'
})
},
WEBSITE: {
type: ArgumentType.STRING,
defaultValue: formatMessage({
id: 'jgWebsiteRequests.website_post_website',
default: 'https://httpbin.org/post',
description: 'The website to post the key and content to.'
})
}
}
}
]
};
}
encodeTextForURL (args) {
return encodeURIComponent(String(args.TEXT));
}
decodeUrlForText (args) {
return decodeURI(String(args.TEXT));
}
getWebsiteContent (args) {
return new Promise(resolve => {
if (window && !window.fetch) return resolve("");
const fetchingUrl = args.WEBSITE.replace("rawRequest()", "");
fetch(fetchingUrl, {cache: "no-cache"}).then(r => {
r.text().then(text => {
resolve(String(text));
})
.catch(() => {
resolve("");
});
})
.catch(() => {
resolve("");
});
});
}
getWebsiteBinaryData (args) {
return new Promise(resolve => {
if (window && !window.fetch) return resolve("[]");
const fetchingUrl = args.WEBSITE.replace("rawRequest()", "");
fetch(fetchingUrl, {cache: "no-cache"}).then(r => {
r.arrayBuffer().then(buffer => {
resolve(String(JSON.stringify(BufferStuff.bufferToArray(buffer))));
})
.catch(() => {
resolve("[]");
});
})
.catch(() => {
resolve("[]");
});
});
}
postWithContentToWebsite (args) {
return new Promise(resolve => {
if (window && !window.fetch) return resolve("");
const body = {};
const checking = String(args.CONTENT);
let canJSONParse = true;
try {
JSON.parse(checking);
} catch {
canJSONParse = false;
}
body[String(args.KEY)] = checking === "true" ? true :
checking === "false" ? false :
Number(checking) ? Number(checking) :
checking === "null" ? null :
canJSONParse ? JSON.parse(checking) :
checking;
fetch(args.WEBSITE, {
method: "POST",
headers: { "Content-Type": "application/json" },
cache: "no-cache",
body: JSON.stringify(body)
}).then(r => {
r.text().then(text => {
resolve(String(text));
})
.catch(() => {
resolve("");
});
})
.catch(() => {
resolve("");
});
});
}
}
module.exports = JgWebsiteRequestBlocks;