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 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 {getNamesFromString} = require("../lib/unicode.js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const avatar = new Command("avatar");
 | 
					const avatar = new Command("avatar");
 | 
				
			||||||
| 
						 | 
					@ -580,7 +580,9 @@ jumbo.callback = async function (msg, line) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (set.suffix == ".svg") {
 | 
					    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})
 | 
					      const converted = await sharp(svg, {density: 2400})
 | 
				
			||||||
        .resize(1024)
 | 
					        .resize(1024)
 | 
				
			||||||
        .toBuffer();
 | 
					        .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");
 | 
					const presence = new Command("presence");
 | 
				
			||||||
presence.category = CATEGORY;
 | 
					presence.category = CATEGORY;
 | 
				
			||||||
presence.helpText = "Get presences of a user.";
 | 
					presence.helpText = "Get presences of a user.";
 | 
				
			||||||
| 
						 | 
					@ -690,8 +703,8 @@ presence.callback = async function (msg, line) {
 | 
				
			||||||
            userIDs: [user.id],
 | 
					            userIDs: [user.id],
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
          member = fetched[0];
 | 
					          member = fetched[0];
 | 
				
			||||||
          target = member;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        target = member;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
| 
						 | 
					@ -709,9 +722,127 @@ presence.callback = async function (msg, line) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const embeds = [];
 | 
					    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 {
 | 
					    return {
 | 
				
			||||||
      content: `Presence for **${target.tag}**: ${icons}`,
 | 
					      content: `Presence for **${target.tag}**: ${icons}`,
 | 
				
			||||||
 | 
					      embeds,
 | 
				
			||||||
 | 
					      files,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    return ":warning: Could not get user???";
 | 
					    return ":warning: Could not get user???";
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue