From b559edcd10a615677222b0c885d942e7105f3cec Mon Sep 17 00:00:00 2001
From: Supositware <sup@libtar.de>
Date: Sun, 4 Jun 2023 19:02:30 +0200
Subject: [PATCH] Use twitter-api-v2 instead of twit

---
 commands/fun/tweet.js | 122 ++++++++++++++++++------------------------
 package-lock.json     |  21 ++------
 package.json          |   2 +-
 3 files changed, 57 insertions(+), 88 deletions(-)

diff --git a/commands/fun/tweet.js b/commands/fun/tweet.js
index b76ab44..7878338 100644
--- a/commands/fun/tweet.js
+++ b/commands/fun/tweet.js
@@ -1,6 +1,6 @@
 import { SlashCommandBuilder } from 'discord.js';
 import { EmbedBuilder } from 'discord.js';
-import Twit from 'twit';
+import { TwitterApi } from 'twitter-api-v2';
 import fetch from 'node-fetch';
 import os from 'node:os';
 import fs from 'node:fs';
@@ -114,11 +114,11 @@ export default {
 		}
 
 
-		const T = new Twit({
-			consumer_key: twiConsumer,
-			consumer_secret: twiConsumerSecret,
-			access_token: twiToken,
-			access_token_secret: twiTokenSecret,
+		const userClient = new TwitterApi({
+			appKey: twiConsumer,
+			appSecret: twiConsumerSecret,
+			accessToken: twiToken,
+			accessSecret: twiTokenSecret,
 		});
 
 		try {
@@ -140,7 +140,9 @@ export default {
 						return interaction.editReply({ content: 'Gifs can\'t be larger than 15 MB!' });
 					}
 
-					const b64Image = fs.readFileSync(`${os.tmpdir()}/${attachment.name}`, { encoding: 'base64' });
+					const image = await userClient.v1.uploadMedia(`${os.tmpdir()}/${attachment.name}`);
+					Tweet(image);
+					/*
 					T.post('media/upload', { media_data: b64Image }, function(err, data) {
 						if (err) {
 							console.log('OH NO AN ERROR!!!!!!!');
@@ -151,6 +153,7 @@ export default {
 							Tweet(data);
 						}
 					});
+					*/
 				}
 				else {
 					await interaction.editReply({ content: 'File type not supported, you can only send jpg/png/gif' });
@@ -167,74 +170,51 @@ export default {
 			return;
 		}
 
-		function Tweet(data) {
-			let options = {
-				status: tweet,
-			};
-
-			if (data && tweet) {
-				options = {
-					status: tweet,
-					media_ids: new Array(data.media_id_string),
-				};
+		async function Tweet(img) {
+			console.log(img);
+			let options = null;
+			if (img) {
+				options = { media: { media_ids: new Array(img) } };
 			}
-			else if (data) {
-				options = {
-					media_ids: new Array(data.media_id_string),
-				};
+			const tweeted = await userClient.v2.tweet(tweet, options);
+
+			console.log(tweeted);
+
+
+			const tweetid = tweeted.data.id;
+			const FunnyWords = ['oppaGangnamStyle', '69', '420', 'cum', 'funnyMan', 'GUCCISmartToilet', 'TwitterForClowns', 'fart', 'ok', 'hi', 'howAreYou', 'WhatsNinePlusTen', '21'];
+			const TweetLink = `https://twitter.com/${FunnyWords[Math.floor((Math.random() * FunnyWords.length))]}/status/${tweetid}`;
+
+			let channel = await client.channels.resolve(twiChannel);
+			channel.send(TweetLink);
+
+			const Embed = new EmbedBuilder()
+				.setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() })
+				.setDescription(tweet ? tweet : 'No content.')
+				.addFields(
+					{ name: 'Link', value: TweetLink, inline: true },
+					{ name: 'Tweet ID', value: tweetid, inline: true },
+					{ name: 'Channel ID', value: interaction.channel.id, inline: true },
+					{ name: 'Message ID', value: interaction.id, inline: true },
+					{ name: 'Author', value: `${interaction.user.username} (${interaction.user.id})`, inline: true },
+				)
+				.setTimestamp();
+
+			if (interaction.guild) {
+				Embed.addFields(
+					{ name: 'Guild', value: `${interaction.guild.name} (${interaction.guild.id})`, inline: true },
+					{ name: 'message link', value: `https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}/${interaction.id}`, inline: true },
+				);
+			}
+			else {
+				Embed.addFields({ name: 'message link', value: `https://discord.com/channels/@me/${interaction.channel.id}/${interaction.id}` });
 			}
 
-			T.post('statuses/update', options, function(err, response) {
-				if (err) {
-					// Rate limit exceeded
-					if (err.code == 88) return interaction.editReply({ content: err.interaction });
-					// Tweet needs to be a bit shorter.
-					if (err.code == 186) return interaction.editReply({ content: `${err.interaction} Your interaction was ${tweet.length} characters, you need to remove ${tweet.length - 280} characters (This count may be inaccurate if your interaction contained link)` });
-					// Status is a duplicate.
-					if (err.code == 187) return interaction.editReply({ content: err.interaction });
-					// To protect our users from spam and other malicious activity, this account is temporarily locked.
-					if (err.code == 326) return interaction.editReply({ content: err.interaction });
-					console.error('OH NO!!!!');
-					console.error(err);
-					return interaction.editReply({ content: 'OH NO!!! AN ERROR HAS occurred!!! please hold on while i find what\'s causing this issue!' });
-				}
+			if (attachment) Embed.setImage(attachment.url);
 
-				const tweetid = response.id_str;
-				const FunnyWords = ['oppaGangnamStyle', '69', '420', 'cum', 'funnyMan', 'GUCCISmartToilet', 'TwitterForClowns', 'fart', 'ok', 'hi', 'howAreYou', 'WhatsNinePlusTen', '21'];
-				const TweetLink = `https://twitter.com/${FunnyWords[Math.floor((Math.random() * FunnyWords.length))]}/status/${tweetid}`;
-
-				// Im too lazy for now to make an entry in config.json
-				let channel = client.channels.resolve(twiChannel);
-				channel.send(TweetLink);
-
-				const Embed = new EmbedBuilder()
-					.setAuthor({ name: interaction.user.username, iconURL: interaction.user.displayAvatarURL() })
-					.setDescription(tweet ? tweet : 'No content.')
-					.addFields(
-						{ name: 'Link', value: TweetLink, inline: true },
-						{ name: 'Tweet ID', value: tweetid, inline: true },
-						{ name: 'Channel ID', value: interaction.channel.id, inline: true },
-						{ name: 'Message ID', value: interaction.id, inline: true },
-						{ name: 'Author', value: `${interaction.user.username} (${interaction.user.id})`, inline: true },
-					)
-					.setTimestamp();
-
-				if (interaction.guild) {
-					Embed.addFields(
-						{ name: 'Guild', value: `${interaction.guild.name} (${interaction.guild.id})`, inline: true },
-						{ name: 'message link', value: `https://discord.com/channels/${interaction.guild.id}/${interaction.channel.id}/${interaction.id}`, inline: true },
-					);
-				}
-				else {
-					Embed.addFields({ name: 'message link', value: `https://discord.com/channels/@me/${interaction.channel.id}/${interaction.id}` });
-				}
-
-				if (attachment) Embed.setImage(attachment.url);
-
-				channel = client.channels.resolve(twiLogChannel);
-				channel.send({ embeds: [Embed] });
-				return interaction.editReply({ content: `Go see ur epic tweet ${TweetLink}` });
-			});
+			channel = await client.channels.resolve(twiLogChannel);
+			channel.send({ embeds: [Embed] });
+			return interaction.editReply({ content: `Go see ur epic tweet ${TweetLink}` });
 		}
 	},
 };
diff --git a/package-lock.json b/package-lock.json
index 9ce778d..82dbac2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,7 +19,7 @@
         "safe-regex": "github:davisjam/safe-regex",
         "sequelize": "^6.21.3",
         "turndown": "^7.1.1",
-        "twit": "^1.1.20",
+        "twitter-api-v2": "^1.15.0",
         "ytpplus-node": "github:Supositware/ytpplus-node"
       },
       "devDependencies": {
@@ -5159,11 +5159,6 @@
         "set-blocking": "^2.0.0"
       }
     },
-    "node_modules/oauth": {
-      "version": "0.9.9",
-      "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.9.tgz",
-      "integrity": "sha512-kjdfbdtIFcfvHTdvh+pbR5RMOxrihCmMtDjOCAieetr4NoUOuRjl1q9gyGnvpPNDOalH8moHqur150XYGPQFeA=="
-    },
     "node_modules/object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -6822,16 +6817,10 @@
         "domino": "^2.1.6"
       }
     },
-    "node_modules/twit": {
-      "version": "1.1.20",
-      "resolved": "https://registry.npmjs.org/twit/-/twit-1.1.20.tgz",
-      "integrity": "sha512-5Wb4b+1mqSxOXGrTe5O4GIB6/IQnh5anAub34M+VfAdA1g+9QfUuod4C94xf9NNcaz+rNZ/3LRUSTpn8wLMnYA==",
-      "dependencies": {
-        "oauth": "0.9.9"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
+    "node_modules/twitter-api-v2": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/twitter-api-v2/-/twitter-api-v2-1.15.0.tgz",
+      "integrity": "sha512-Cqg3pIGhSwPyFBndpBrucdeNXecNFnYcXy3ixQ4brJHd/3k1CAtBVcX0e3s6jRYl/QIx5BmyGXS/SHEGtYZ3gw=="
     },
     "node_modules/type": {
       "version": "1.2.0",
diff --git a/package.json b/package.json
index 6c449d6..d663364 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
     "safe-regex": "github:davisjam/safe-regex",
     "sequelize": "^6.21.3",
     "turndown": "^7.1.1",
-    "twit": "^1.1.20",
+    "twitter-api-v2": "^1.15.0",
     "ytpplus-node": "github:Supositware/ytpplus-node"
   },
   "devDependencies": {