logging: join/leave
This commit is contained in:
		
							parent
							
								
									d59b180961
								
							
						
					
					
						commit
						3199df420c
					
				
					 2 changed files with 163 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1,10 +1,15 @@
 | 
			
		|||
const {Member} = require("@projectdysnomia/dysnomia");
 | 
			
		||||
 | 
			
		||||
const {getGuildData} = require("#lib/guildData.js");
 | 
			
		||||
const events = require("#lib/events.js");
 | 
			
		||||
 | 
			
		||||
//const {AuditLogActions} = require("#util/dconstants.js");
 | 
			
		||||
const {/*AuditLogActions,*/ APIEndpoints, CDNEndpoints, GuildIntegrationTypes} = require("#util/dconstants.js");
 | 
			
		||||
const {JoinSourceTypeNames} = require("#util/constants.js");
 | 
			
		||||
const {formatUsername, getDefaultAvatar} = require("#util/misc.js");
 | 
			
		||||
const {snowflakeToTimestamp} = require("#util/time.js");
 | 
			
		||||
 | 
			
		||||
//const COLOR_ADDED = 0x399d53;
 | 
			
		||||
//const COLOR_REMOVED = 0xe55152;
 | 
			
		||||
const COLOR_ADDED = 0x399d53;
 | 
			
		||||
const COLOR_REMOVED = 0xe55152;
 | 
			
		||||
const COLOR_CHANGED = 0x3c8cec;
 | 
			
		||||
 | 
			
		||||
async function getLoggingChannel(guild) {
 | 
			
		||||
| 
						 | 
				
			
			@ -52,8 +57,152 @@ events.add("guildUpdate", "logging", async function (guild, oldGuild) {
 | 
			
		|||
          color: COLOR_CHANGED,
 | 
			
		||||
          title: "Features Updated",
 | 
			
		||||
          description: diff,
 | 
			
		||||
          timestamp: new Date().toISOString(),
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
    })
 | 
			
		||||
    .catch(() => {});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
events.add("guildMemberAdd", "logging", async function (guild, member) {
 | 
			
		||||
  const channel = await getLoggingChannel(guild);
 | 
			
		||||
  if (!channel) return;
 | 
			
		||||
 | 
			
		||||
  const user = member.user;
 | 
			
		||||
  const defaultAvatar = getDefaultAvatar(user.id, user.discriminator ?? 0);
 | 
			
		||||
  const avatar = user.avatar ? CDNEndpoints.USER_AVATAR(user.id, user.avatar) : defaultAvatar;
 | 
			
		||||
 | 
			
		||||
  const memberSearch = await hf.bot.requestHandler
 | 
			
		||||
    .request("POST", `/guilds/${guild.id}/members-search`, true, {
 | 
			
		||||
      and_query: {user_id: {or_query: [user.id]}},
 | 
			
		||||
      or_query: {},
 | 
			
		||||
      limit: 5,
 | 
			
		||||
    })
 | 
			
		||||
    .then((res) => res?.members?.[0])
 | 
			
		||||
    .catch(() => {});
 | 
			
		||||
 | 
			
		||||
  let inviter;
 | 
			
		||||
  if (memberSearch?.inviter_id) inviter = await guild.getMember(memberSearch.inviter_id);
 | 
			
		||||
 | 
			
		||||
  channel
 | 
			
		||||
    .createMessage({
 | 
			
		||||
      embeds: [
 | 
			
		||||
        {
 | 
			
		||||
          color: COLOR_ADDED,
 | 
			
		||||
          title: "Member Joined",
 | 
			
		||||
          description: `<@${user.id}> ${formatUsername(user)}`,
 | 
			
		||||
          timestamp: new Date().toISOString(),
 | 
			
		||||
          thumbnail: {
 | 
			
		||||
            url: avatar,
 | 
			
		||||
          },
 | 
			
		||||
          fields: [
 | 
			
		||||
            {
 | 
			
		||||
              name: "Created",
 | 
			
		||||
              value: `<t:${Math.floor(snowflakeToTimestamp(user.id) / 1000)}:R>`,
 | 
			
		||||
              inline: true,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              name: "Join Method",
 | 
			
		||||
              value: memberSearch?.join_source_type
 | 
			
		||||
                ? `${JoinSourceTypeNames[memberSearch.join_source_type]}${
 | 
			
		||||
                    memberSearch.source_invite_code
 | 
			
		||||
                      ? ` via \`${memberSearch.source_invite_code}\``
 | 
			
		||||
                      : memberSearch.integration_type
 | 
			
		||||
                      ? ` via \`${
 | 
			
		||||
                          GuildIntegrationTypes[memberSearch.integration_type] ??
 | 
			
		||||
                          `<unknown integration: ${memberSearch.integration_type}>`
 | 
			
		||||
                        }\``
 | 
			
		||||
                      : ""
 | 
			
		||||
                  }`
 | 
			
		||||
                : "Unknown",
 | 
			
		||||
              inline: true,
 | 
			
		||||
            },
 | 
			
		||||
            inviter && {
 | 
			
		||||
              name: "Inviter",
 | 
			
		||||
              value: `<@${inviter.id}> ${formatUsername(inviter.user)}`,
 | 
			
		||||
              inline: true,
 | 
			
		||||
            },
 | 
			
		||||
          ].filter((x) => !!x),
 | 
			
		||||
          footer: {
 | 
			
		||||
            text: user.id,
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
    })
 | 
			
		||||
    .catch(() => {});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
events.add("guildMemberRemove", "logging", async function (guild, member) {
 | 
			
		||||
  const channel = await getLoggingChannel(guild);
 | 
			
		||||
  if (!channel) return;
 | 
			
		||||
 | 
			
		||||
  const timestamp = new Date().toISOString();
 | 
			
		||||
 | 
			
		||||
  if (member instanceof Member) {
 | 
			
		||||
    const user = member.user;
 | 
			
		||||
    const defaultAvatar = getDefaultAvatar(user.id, user.discriminator ?? 0);
 | 
			
		||||
    const avatar = user.avatar ? CDNEndpoints.USER_AVATAR(user.id, user.avatar) : defaultAvatar;
 | 
			
		||||
 | 
			
		||||
    channel
 | 
			
		||||
      .createMessage({
 | 
			
		||||
        embeds: [
 | 
			
		||||
          {
 | 
			
		||||
            color: COLOR_REMOVED,
 | 
			
		||||
            title: "Member Left",
 | 
			
		||||
            description: `<@${user.id}> ${formatUsername(user)}`,
 | 
			
		||||
            timestamp,
 | 
			
		||||
            thumbnail: {
 | 
			
		||||
              url: avatar,
 | 
			
		||||
            },
 | 
			
		||||
            fields: [
 | 
			
		||||
              {
 | 
			
		||||
                name: "Joined",
 | 
			
		||||
                value: `<t:${Math.floor(member.joinedAt / 1000)}:R>`,
 | 
			
		||||
                inline: true,
 | 
			
		||||
              },
 | 
			
		||||
              member?.nick && {
 | 
			
		||||
                name: "Nickname",
 | 
			
		||||
                value: member.nick,
 | 
			
		||||
                inline: true,
 | 
			
		||||
              },
 | 
			
		||||
              member?.roles?.length > 0 && {
 | 
			
		||||
                name: "Roles",
 | 
			
		||||
                value: member.roles
 | 
			
		||||
                  .sort((a, b) => guild.roles.get(b).position - guild.roles.get(a).position)
 | 
			
		||||
                  .map((role) => `<@&${role}>`)
 | 
			
		||||
                  .join(", "),
 | 
			
		||||
                inline: false,
 | 
			
		||||
              },
 | 
			
		||||
            ].filter((x) => !!x),
 | 
			
		||||
            footer: {
 | 
			
		||||
              text: user.id,
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      })
 | 
			
		||||
      .catch(() => {});
 | 
			
		||||
  } else {
 | 
			
		||||
    const user = await hf.bot.requestHandler.request("GET", APIEndpoints.USER(member.user.id), true);
 | 
			
		||||
    const defaultAvatar = getDefaultAvatar(user.id, user.discriminator ?? 0);
 | 
			
		||||
    const avatar = user.avatar ? CDNEndpoints.USER_AVATAR(user.id, user.avatar) : defaultAvatar;
 | 
			
		||||
 | 
			
		||||
    channel
 | 
			
		||||
      .createMessage({
 | 
			
		||||
        embeds: [
 | 
			
		||||
          {
 | 
			
		||||
            color: COLOR_REMOVED,
 | 
			
		||||
            title: "Member Left",
 | 
			
		||||
            description: `-# Uncached member, limited info\n<@${user.id}> ${formatUsername(user)}`,
 | 
			
		||||
            timestamp,
 | 
			
		||||
            thumbnail: {
 | 
			
		||||
              url: avatar,
 | 
			
		||||
            },
 | 
			
		||||
            footer: {
 | 
			
		||||
              text: user.id,
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      })
 | 
			
		||||
      .catch(() => {});
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -687,3 +687,14 @@ module.exports.ApplicationFlagNames = [
 | 
			
		|||
  "iframe Modals",
 | 
			
		||||
  "Social Layer Integration",
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
module.exports.JoinSourceTypeNames = {
 | 
			
		||||
  0: "Unspecified",
 | 
			
		||||
  1: "Bot",
 | 
			
		||||
  2: "Integration",
 | 
			
		||||
  3: "Discovery",
 | 
			
		||||
  4: "Hub",
 | 
			
		||||
  5: "Invite",
 | 
			
		||||
  6: "Vanity URL",
 | 
			
		||||
  7: "Manual Verification",
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue