n8n-nodes-base
Version:
Base nodes of n8n
254 lines • 12.7 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TwitterV2 = void 0;
const iso_639_1_1 = __importDefault(require("iso-639-1"));
const luxon_1 = require("luxon");
const n8n_workflow_1 = require("n8n-workflow");
const DirectMessageDescription_1 = require("./DirectMessageDescription");
const GenericFunctions_1 = require("./GenericFunctions");
const ListDescription_1 = require("./ListDescription");
const TweetDescription_1 = require("./TweetDescription");
const UserDescription_1 = require("./UserDescription");
class TwitterV2 {
description;
constructor(baseDescription) {
this.description = {
...baseDescription,
version: 2,
description: 'Post, like, and search tweets, send messages, search users, and add users to lists',
subtitle: '={{$parameter["operation"] + ":" + $parameter["resource"]}}',
defaults: {
name: 'X',
},
usableAsTool: true,
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
credentials: [
{
name: 'twitterOAuth2Api',
required: true,
},
],
properties: [
{
displayName: 'Resource',
name: 'resource',
type: 'options',
noDataExpression: true,
options: [
{
name: 'Direct Message',
value: 'directMessage',
description: 'Send a direct message to a user',
},
{
name: 'List',
value: 'list',
description: 'Add a user to a list',
},
{
name: 'Tweet',
value: 'tweet',
description: 'Create, like, search, or delete a tweet',
},
{
name: 'User',
value: 'user',
description: 'Search users by username',
},
],
default: 'tweet',
},
// DIRECT MESSAGE
...DirectMessageDescription_1.directMessageOperations,
...DirectMessageDescription_1.directMessageFields,
// LIST
...ListDescription_1.listOperations,
...ListDescription_1.listFields,
// TWEET
...TweetDescription_1.tweetOperations,
...TweetDescription_1.tweetFields,
// USER
...UserDescription_1.userOperations,
...UserDescription_1.userFields,
],
};
}
methods = {
loadOptions: {
// Get all the available languages to display them to user so that they can
// select them easily
async getLanguages() {
const returnData = [];
const languages = iso_639_1_1.default.getAllNames();
for (const language of languages) {
const languageName = language;
const languageId = iso_639_1_1.default.getCode(language);
returnData.push({
name: languageName,
value: languageId,
});
}
return returnData;
},
},
};
async execute() {
const items = this.getInputData();
const returnData = [];
const length = items.length;
let responseData;
const resource = this.getNodeParameter('resource', 0);
const operation = this.getNodeParameter('operation', 0);
for (let i = 0; i < length; i++) {
try {
if (resource === 'user') {
if (operation === 'searchUser') {
const me = this.getNodeParameter('me', i, false);
if (me) {
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'GET', '/users/me', {});
}
else {
const userRlc = this.getNodeParameter('user', i, undefined, {});
if (userRlc.mode === 'username') {
userRlc.value = userRlc.value.includes('@')
? userRlc.value.replace('@', '')
: userRlc.value;
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'GET', `/users/by/username/${userRlc.value}`, {});
}
else if (userRlc.mode === 'id') {
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'GET', `/users/${userRlc.value}`, {});
}
}
}
}
if (resource === 'tweet') {
if (operation === 'search') {
const searchText = this.getNodeParameter('searchText', i, '', {});
const returnAll = this.getNodeParameter('returnAll', i);
const { sortOrder, startTime, endTime, tweetFieldsObject } = this.getNodeParameter('additionalFields', i, {});
const qs = {
query: searchText,
};
if (endTime) {
const endTimeISO = luxon_1.DateTime.fromISO(endTime).toISO();
qs.end_time = endTimeISO;
}
if (sortOrder) {
qs.sort_order = sortOrder;
}
if (startTime) {
const startTimeISO8601 = luxon_1.DateTime.fromISO(startTime).toISO();
qs.start_time = startTimeISO8601;
}
if (tweetFieldsObject) {
if (tweetFieldsObject.length > 0) {
qs['tweet.fields'] = tweetFieldsObject.join(',');
}
}
if (returnAll) {
responseData = await GenericFunctions_1.twitterApiRequestAllItems.call(this, 'data', 'GET', '/tweets/search/recent', {}, qs);
}
else {
const limit = this.getNodeParameter('limit', i);
qs.max_results = limit;
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'GET', '/tweets/search/recent', {}, qs);
}
}
if (operation === 'create') {
const text = this.getNodeParameter('text', i, '', {});
const { location, attachments, inQuoteToStatusId, inReplyToStatusId } = this.getNodeParameter('additionalFields', i, {});
const body = {
text,
};
if (location) {
body.geo = { place_id: location };
}
if (attachments) {
body.media = { media_ids: [attachments] };
}
if (inQuoteToStatusId) {
body.quote_tweet_id = (0, GenericFunctions_1.returnId)(inQuoteToStatusId);
}
if (inReplyToStatusId) {
const inReplyToStatusIdValue = { in_reply_to_tweet_id: (0, GenericFunctions_1.returnId)(inReplyToStatusId) };
body.reply = inReplyToStatusIdValue;
}
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'POST', '/tweets', body);
}
if (operation === 'delete') {
const tweetRLC = this.getNodeParameter('tweetDeleteId', i, '', {});
const tweetId = (0, GenericFunctions_1.returnId)(tweetRLC);
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'DELETE', `/tweets/${tweetId}`, {});
}
if (operation === 'like') {
const tweetRLC = this.getNodeParameter('tweetId', i, '', {});
const tweetId = (0, GenericFunctions_1.returnId)(tweetRLC);
const body = {
tweet_id: tweetId,
};
const user = (await GenericFunctions_1.twitterApiRequest.call(this, 'GET', '/users/me', {}));
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'POST', `/users/${user.id}/likes`, body);
}
if (operation === 'retweet') {
const tweetRLC = this.getNodeParameter('tweetId', i, '', {});
const tweetId = (0, GenericFunctions_1.returnId)(tweetRLC);
const body = {
tweet_id: tweetId,
};
const user = (await GenericFunctions_1.twitterApiRequest.call(this, 'GET', '/users/me', {}));
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'POST', `/users/${user.id}/retweets`, body);
}
}
if (resource === 'list') {
if (operation === 'add') {
const userRlc = this.getNodeParameter('user', i, '', {});
const userId = userRlc.mode !== 'username'
? (0, GenericFunctions_1.returnId)(userRlc)
: await GenericFunctions_1.returnIdFromUsername.call(this, userRlc);
const listRlc = this.getNodeParameter('list', i, '', {});
const listId = (0, GenericFunctions_1.returnId)(listRlc);
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'POST', `/lists/${listId}/members`, {
user_id: userId,
});
}
}
if (resource === 'directMessage') {
if (operation === 'create') {
const userRlc = this.getNodeParameter('user', i, '', {});
const user = await GenericFunctions_1.returnIdFromUsername.call(this, userRlc);
const text = this.getNodeParameter('text', i, '', {});
const { attachments } = this.getNodeParameter('additionalFields', i, {}, {});
const body = {
text,
};
if (attachments) {
body.attachments = [{ media_id: attachments }];
}
responseData = await GenericFunctions_1.twitterApiRequest.call(this, 'POST', `/dm_conversations/with/${user}/messages`, body);
}
}
const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(responseData), { itemData: { item: i } });
returnData.push(...executionData);
}
catch (error) {
if (this.continueOnFail()) {
const executionErrorData = {
json: {
error: error.message,
},
};
returnData.push(executionErrorData);
continue;
}
throw error;
}
}
return [returnData];
}
}
exports.TwitterV2 = TwitterV2;
//# sourceMappingURL=TwitterV2.node.js.map