dirtycajunrice / Get Discord Server Members

// ==UserScript==
// @name        Get Discord Server Members
// @namespace   DirtyCajunRice
// @match       https://discord.com/channels/*
// @grant       GM_log
// @grant       GM_registerMenuCommand
// @version     1.0.3
// @author      DirtyCajunRice
// @description Gets all visible member IDs in a discord 
// @license     MIT
// @copyright   2021, dirtycajunrice (https://openuserjs.org/users/dirtycajunrice)
// @run-at      document-idle
// @require     https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1
// @downloadURL https://openuserjs.org/install/dirtycajunrice/Get_Discord_Server_Members.user.js
// @homepageURL https://openuserjs.org/scripts/dirtycajunrice/Get_Discord_Server_Members
// ==/UserScript==

const AvatarURLPrefix = "https://cdn.discordapp.com/avatars/"

var GuildMembers = {};
var GuildMembersPane = {};

GM_registerMenuCommand("Get Member List", collect);

VM.shortcut.register('c-s-q', collect);

function collect() {
  let member_count = Object.keys(GuildMembers).length
  let added = 0
  
  let avatars = Array.from(document.querySelectorAll("img[src^='" + AvatarURLPrefix + "']")).filter(item => !item.className.includes("clickable"))
  for (i of avatars) {
    try {
      let mid = i.src.split("/")[4]
      GuildMembers[mid] = i.parentElement.parentElement.parentElement.parentElement.getAttribute("aria-label").split(",")[0]
    } catch (e) {
      console.log(`Error Kind: ${e.name}`)
      console.log(`Message: ${e.message}`)
      console.log(`Location: ${e.fileName}:${e.lineNumber}:${e.columnNumber}`)
      console.log(`Stack Trace: ${e.stack}`)
      console.log(`Current Data:`)
      console.log(avatars)
      console.log(i)
      continue
    }
  }
  avatars[avatars.length-1].scrollIntoView()
  let new_member_count = Object.keys(GuildMembers).length
  added = new_member_count - member_count
  member_count = new_member_count
  if (added > 0) attempts = 0
  
  GM_log(`Members - Added: ${added} | Total ${member_count}`)
  GM_log(GuildMembers)
}