Added the ability for sticker to check for stickers previously posted in a channel
This commit is contained in:
		
							parent
							
								
									d54e4e0117
								
							
						
					
					
						commit
						d42c67cde2
					
				
					 2 changed files with 35 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -1,23 +1,24 @@
 | 
			
		|||
import Command from "../../classes/command.js";
 | 
			
		||||
import imagedetect from "../../utils/imagedetect.js";
 | 
			
		||||
 | 
			
		||||
class StickerCommand extends Command {
 | 
			
		||||
  async run() {
 | 
			
		||||
    if (!this.message.stickerItems) return "You need to provide a sticker!";
 | 
			
		||||
    const sticker = this.message.stickerItems[0];
 | 
			
		||||
    if (sticker.format_type === 1) { // PNG
 | 
			
		||||
      return `https://cdn.discordapp.com/stickers/${sticker.id}.png`;
 | 
			
		||||
    } else if (sticker.format_type === 2) { // APNG
 | 
			
		||||
    const result = await imagedetect(this.client, this.message, false, false, true);
 | 
			
		||||
    if (!result) return "You need to provide a sticker!";
 | 
			
		||||
    if (result.format_type === 1) { // PNG
 | 
			
		||||
      return `https://cdn.discordapp.com/stickers/${result.id}.png`;
 | 
			
		||||
    } else if (result.format_type === 2) { // APNG
 | 
			
		||||
      return {
 | 
			
		||||
        embed: {
 | 
			
		||||
          color: 16711680,
 | 
			
		||||
          description: `[This sticker is an APNG; however, since Discord doesn't allow displaying APNGs outside of stickers, you'll have to save it or open it in your browser to view it.](https://cdn.discordapp.com/stickers/${sticker.id}.png)`,
 | 
			
		||||
          description: `[This sticker is an APNG; however, since Discord doesn't allow displaying APNGs outside of stickers, you'll have to save it or open it in your browser to view it.](https://cdn.discordapp.com/stickers/${result.id}.png)`,
 | 
			
		||||
          image: {
 | 
			
		||||
            url: `https://cdn.discordapp.com/stickers/${sticker.id}.png`
 | 
			
		||||
            url: `https://cdn.discordapp.com/stickers/${result.id}.png`
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
    } else if (sticker.format_type === 3) { // Lottie
 | 
			
		||||
      return `I can't display this sticker because it uses the Lottie animation format; however, I can give you the raw JSON link to it: https://cdn.discordapp.com/stickers/${sticker.id}.json`;
 | 
			
		||||
    } else if (result.format_type === 3) { // Lottie
 | 
			
		||||
      return `I can't display this sticker because it uses the Lottie animation format; however, I can give you the raw JSON link to it: https://cdn.discordapp.com/stickers/${result.id}.json`;
 | 
			
		||||
    } else {
 | 
			
		||||
      return "I don't recognize that sticker format!";
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,8 +94,11 @@ const getImage = async (image, image2, video, extraReturnTypes, gifv = false) =>
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const checkImages = async (message, extraReturnTypes, video) => {
 | 
			
		||||
const checkImages = async (message, extraReturnTypes, video, sticker) => {
 | 
			
		||||
  let type;
 | 
			
		||||
  if (sticker && message.stickerItems) {
 | 
			
		||||
    type = message.stickerItems[0];
 | 
			
		||||
  } else {
 | 
			
		||||
    // first check the embeds
 | 
			
		||||
    if (message.embeds.length !== 0) {
 | 
			
		||||
      // embeds can vary in types, we check for tenor gifs first
 | 
			
		||||
| 
						 | 
				
			
			@ -116,28 +119,29 @@ const checkImages = async (message, extraReturnTypes, video) => {
 | 
			
		|||
    } else if (message.attachments.length !== 0 && message.attachments[0].width) {
 | 
			
		||||
      type = await getImage(message.attachments[0].proxy_url, message.attachments[0].url, video);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // if the return value exists then return it
 | 
			
		||||
  return type ? type : false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// this checks for the latest message containing an image and returns the url of the image
 | 
			
		||||
export default async (client, cmdMessage, extraReturnTypes = false, video = false) => {
 | 
			
		||||
export default async (client, cmdMessage, extraReturnTypes = false, video = false, sticker = false) => {
 | 
			
		||||
  // we start by checking if the message is a reply to another message
 | 
			
		||||
  if (cmdMessage.messageReference) {
 | 
			
		||||
    const replyMessage = await client.getMessage(cmdMessage.messageReference.channelID, cmdMessage.messageReference.messageID).catch(() => undefined);
 | 
			
		||||
    if (replyMessage) {
 | 
			
		||||
      const replyResult = await checkImages(replyMessage, extraReturnTypes, video);
 | 
			
		||||
      const replyResult = await checkImages(replyMessage, extraReturnTypes, video, sticker);
 | 
			
		||||
      if (replyResult !== false) return replyResult;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  // then we check the current message
 | 
			
		||||
  const result = await checkImages(cmdMessage, extraReturnTypes, video);
 | 
			
		||||
  const result = await checkImages(cmdMessage, extraReturnTypes, video, sticker);
 | 
			
		||||
  if (result !== false) return result;
 | 
			
		||||
  // if there aren't any replies then iterate over the last few messages in the channel
 | 
			
		||||
  const messages = await client.getMessages(cmdMessage.channel.id);
 | 
			
		||||
  // iterate over each message
 | 
			
		||||
  for (const message of messages) {
 | 
			
		||||
    const result = await checkImages(message, extraReturnTypes, video);
 | 
			
		||||
    const result = await checkImages(message, extraReturnTypes, video, sticker);
 | 
			
		||||
    if (result === false) {
 | 
			
		||||
      continue;
 | 
			
		||||
    } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue