utility.presence: add activities
This commit is contained in:
		
							parent
							
								
									3c3d4e5eff
								
							
						
					
					
						commit
						8f4b230326
					
				
					 1 changed files with 134 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -59,7 +59,7 @@ const CUSTOM_EMOTE_REGEX = /<(?:\u200b|&)?(a)?:(\w+):(\d+)>/;
 | 
			
		|||
 | 
			
		||||
const sharp = require("sharp");
 | 
			
		||||
 | 
			
		||||
const {hastebin, lookupUser} = require("../lib/utils.js");
 | 
			
		||||
const {hastebin, lookupUser, formatTime} = require("../lib/utils.js");
 | 
			
		||||
const {getNamesFromString} = require("../lib/unicode.js");
 | 
			
		||||
 | 
			
		||||
const avatar = new Command("avatar");
 | 
			
		||||
| 
						 | 
				
			
			@ -580,7 +580,9 @@ jumbo.callback = async function (msg, line) {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if (set.suffix == ".svg") {
 | 
			
		||||
      const svg = await fetch(url).then((res) => res.buffer());
 | 
			
		||||
      const svg = await fetch(url)
 | 
			
		||||
        .then((res) => res.arrayBuffer())
 | 
			
		||||
        .then((b) => Buffer.from(b));
 | 
			
		||||
      const converted = await sharp(svg, {density: 2400})
 | 
			
		||||
        .resize(1024)
 | 
			
		||||
        .toBuffer();
 | 
			
		||||
| 
						 | 
				
			
			@ -663,6 +665,17 @@ const PRESENCE_ICONS = {
 | 
			
		|||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const PRESENCE_TYPES = [
 | 
			
		||||
  "Playing",
 | 
			
		||||
  "Streaming",
 | 
			
		||||
  "Listening to",
 | 
			
		||||
  "Watching",
 | 
			
		||||
  "",
 | 
			
		||||
  "Competing in",
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const NOWPLAYING_BAR_LENGTH = 30;
 | 
			
		||||
 | 
			
		||||
const presence = new Command("presence");
 | 
			
		||||
presence.category = CATEGORY;
 | 
			
		||||
presence.helpText = "Get presences of a user.";
 | 
			
		||||
| 
						 | 
				
			
			@ -690,8 +703,8 @@ presence.callback = async function (msg, line) {
 | 
			
		|||
            userIDs: [user.id],
 | 
			
		||||
          });
 | 
			
		||||
          member = fetched[0];
 | 
			
		||||
          target = member;
 | 
			
		||||
        }
 | 
			
		||||
        target = member;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
| 
						 | 
				
			
			@ -709,9 +722,127 @@ presence.callback = async function (msg, line) {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    const embeds = [];
 | 
			
		||||
    const files = [];
 | 
			
		||||
 | 
			
		||||
    for (const index in target.presence.activities) {
 | 
			
		||||
      const activity = target.presence.activities[index];
 | 
			
		||||
      if (activity.type == 4) {
 | 
			
		||||
        let emote = "";
 | 
			
		||||
        if (activity.emoji.id) {
 | 
			
		||||
          emote = `<${activity.emoji.animated ? "a" : ""}:${
 | 
			
		||||
            activity.emoji.name
 | 
			
		||||
          }:${activity.emoji.id}>`;
 | 
			
		||||
        } else {
 | 
			
		||||
          emote = activity.emoji.name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        embeds.push({
 | 
			
		||||
          title: `${emote} ${activity.state}`,
 | 
			
		||||
        });
 | 
			
		||||
      } else {
 | 
			
		||||
        const embed = {
 | 
			
		||||
          title: `${PRESENCE_TYPES[activity.type]} **${activity.name}**`,
 | 
			
		||||
        };
 | 
			
		||||
        const descLines = [];
 | 
			
		||||
        if (activity.type == 2) {
 | 
			
		||||
          if (activity.details) descLines.push(`**${activity.details}**`);
 | 
			
		||||
          if (activity.state) descLines.push(activity.state);
 | 
			
		||||
          if (activity.assets?.large_text)
 | 
			
		||||
            descLines.push(activity.assets.large_text);
 | 
			
		||||
        } else {
 | 
			
		||||
          if (activity.details) descLines.push(activity.details);
 | 
			
		||||
          if (activity.state) descLines.push(activity.state);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (activity.timestamps.start && !activity.timestamps.end) {
 | 
			
		||||
          descLines.push(
 | 
			
		||||
            formatTime(Date.now() - activity.timestamps.start) + " elapsed"
 | 
			
		||||
          );
 | 
			
		||||
        } else if (!activity.timestamps.start && activity.timestamps.end) {
 | 
			
		||||
          descLines.push(
 | 
			
		||||
            formatTime(activity.timestamps.end - Date.now()) + " remaining"
 | 
			
		||||
          );
 | 
			
		||||
        } else {
 | 
			
		||||
          const position = Date.now() - activity.timestamps.start;
 | 
			
		||||
          const length = activity.timestamps.end - activity.timestamps.start;
 | 
			
		||||
 | 
			
		||||
          const timeEnd = formatTime(length);
 | 
			
		||||
          const timePos = formatTime(position);
 | 
			
		||||
 | 
			
		||||
          const progress = position / length;
 | 
			
		||||
          const barLength = Math.round(progress * NOWPLAYING_BAR_LENGTH);
 | 
			
		||||
 | 
			
		||||
          const bar = `\`[${"=".repeat(barLength)}${" ".repeat(
 | 
			
		||||
            NOWPLAYING_BAR_LENGTH - barLength
 | 
			
		||||
          )}]\``;
 | 
			
		||||
          const time = `\`${timePos}${" ".repeat(
 | 
			
		||||
            NOWPLAYING_BAR_LENGTH + 2 - timePos.length - timeEnd.length
 | 
			
		||||
          )}${timeEnd}\``;
 | 
			
		||||
 | 
			
		||||
          descLines.push(bar);
 | 
			
		||||
          descLines.push(time);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        embed.description = descLines.join("\n");
 | 
			
		||||
 | 
			
		||||
        if (activity.assets?.large_image) {
 | 
			
		||||
          let largeUrl;
 | 
			
		||||
          if (activity.assets.large_image.startsWith("mp:")) {
 | 
			
		||||
            largeUrl = activity.large_image.replace(
 | 
			
		||||
              "mp:",
 | 
			
		||||
              "https://media.discordapp.net/"
 | 
			
		||||
            );
 | 
			
		||||
          } else {
 | 
			
		||||
            largeUrl = `https://cdn.discordapp.com/app-assets/${activity.application_id}/${activity.assets.large_image}.png`;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          let smallUrl;
 | 
			
		||||
          if (activity.assets.small_image) {
 | 
			
		||||
            if (activity.assets.small_image.startsWith("mp:")) {
 | 
			
		||||
              smallUrl = activity.small_image.replace(
 | 
			
		||||
                "mp:",
 | 
			
		||||
                "https://media.discordapp.net/"
 | 
			
		||||
              );
 | 
			
		||||
            } else {
 | 
			
		||||
              smallUrl = `https://cdn.discordapp.com/app-assets/${activity.application_id}/${activity.assets.small_image}.png`;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          const largeImage = await fetch(largeUrl)
 | 
			
		||||
            .then((res) => res.arrayBuffer())
 | 
			
		||||
            .then((b) => Buffer.from(b));
 | 
			
		||||
          const presenceImage = sharp(largeImage).resize(60, 60);
 | 
			
		||||
          if (smallUrl) {
 | 
			
		||||
            const smallImage = await fetch(smallUrl)
 | 
			
		||||
              .then((res) => res.arrayBuffer())
 | 
			
		||||
              .then((b) => Buffer.from(b));
 | 
			
		||||
            const smallImageSharp = sharp(smallImage).resize(20, 20);
 | 
			
		||||
 | 
			
		||||
            presenceImage.composite([
 | 
			
		||||
              {
 | 
			
		||||
                input: smallImageSharp,
 | 
			
		||||
                gravity: "southeast",
 | 
			
		||||
              },
 | 
			
		||||
            ]);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          files.push({
 | 
			
		||||
            content: presenceImage.toBuffer(),
 | 
			
		||||
            name: `${index}.png`,
 | 
			
		||||
          });
 | 
			
		||||
          embed.thumbnail = {
 | 
			
		||||
            url: `attachment://${index}.png`,
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          embeds.push(embed);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      content: `Presence for **${target.tag}**: ${icons}`,
 | 
			
		||||
      embeds,
 | 
			
		||||
      files,
 | 
			
		||||
    };
 | 
			
		||||
  } else {
 | 
			
		||||
    return ":warning: Could not get user???";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue