summary refs log tree commit diff homepage
path: root/src
diff options
context:
space:
mode:
authordestruc7i0n <destruc7i0n@users.noreply.github.com>2021-06-20 11:31:01 -0400
committerdestruc7i0n <destruc7i0n@users.noreply.github.com>2021-06-20 11:31:01 -0400
commitf419ac651cc8e023f56e00a29a7afd8f6b49ad30 (patch)
tree82ba85e49f27c8b6c912924c7bb8360b2a131ff0 /src
parentreadme updates (diff)
downloadshulker-f419ac651cc8e023f56e00a29a7afd8f6b49ad30.tar.gz
shulker-f419ac651cc8e023f56e00a29a7afd8f6b49ad30.zip
use uuids for avatar requests with webhooks
Diffstat (limited to 'src')
-rw-r--r--src/Discord.ts31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/Discord.ts b/src/Discord.ts
index 7a4f5d6..4debee9 100644
--- a/src/Discord.ts
+++ b/src/Discord.ts
@@ -13,6 +13,8 @@ class Discord {
 
   channel: Snowflake
 
+  uuidCache: Map<string, string>
+
   constructor (config: Config, onReady?: () => void) {
     this.config = config
 
@@ -21,6 +23,8 @@ class Discord {
     this.client.on('message', (message: Message) => this.onMessage(message))
 
     this.channel = config.DISCORD_CHANNEL_ID || ''
+
+    this.uuidCache = new Map()
   }
 
   public async init () {
@@ -195,14 +199,33 @@ class Discord {
     return message
   }
 
-  private makeDiscordWebhook (username: string, message: string) {
+  private async getUUIDFromUsername (username: string): Promise<string | null> {
+    username = username.toLowerCase()
+    if (this.uuidCache.has(username)) return this.uuidCache.get(username)!
+    // otherwise fetch and store
+    try {
+      const response = await (await axios.get('https://api.mojang.com/users/profiles/minecraft/' + username)).data
+      const uuid = response.id
+      this.uuidCache.set(username, uuid)
+      return uuid
+    } catch (e) {
+      console.log(`[ERROR] Could not fetch uuid for ${username}, falling back to Steve for the skin`)
+      return null
+    }
+  }
+
+  private async makeDiscordWebhook (username: string, message: string) {
     message = this.replaceDiscordMentions(message)
 
+    const defaultHead = 'https://minotar.net/helm/c06f89064c8a49119c29ea1dbd1aab82/256.png' // MHF_Steve
+
+    const uuid = await this.getUUIDFromUsername(username)
+
     let avatarURL
     if (username === this.config.SERVER_NAME + ' - Server') { // use avatar for the server
-      avatarURL = this.config.SERVER_IMAGE || 'https://minotar.net/helm/Steve/256.png'
+      avatarURL = this.config.SERVER_IMAGE || defaultHead
     } else { // use avatar for player
-      avatarURL = `https://minotar.net/helm/${username}/256.png`
+      avatarURL = !!uuid ? `https://minotar.net/helm/${uuid}/256.png` : defaultHead
     }
 
     return {
@@ -222,7 +245,7 @@ class Discord {
 
   public async sendMessage (username: string, message: string) {
     if (this.config.USE_WEBHOOKS) {
-      const webhook = this.makeDiscordWebhook(username, message)
+      const webhook = await this.makeDiscordWebhook(username, message)
       try {
         await axios.post(this.config.WEBHOOK_URL, webhook, { headers: { 'Content-Type': 'application/json' } })
       } catch (e) {