From b07503ec21a11a22070644bd6744ea3db5b3c1db Mon Sep 17 00:00:00 2001
From: Will Hunt <half-shot@molrams.com>
Date: Sat, 18 Feb 2017 19:03:43 +0000
Subject: [PATCH] Update presence hooks.

---
 src/discordbot.ts | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/discordbot.ts b/src/discordbot.ts
index 7411cae..fb01463 100644
--- a/src/discordbot.ts
+++ b/src/discordbot.ts
@@ -27,6 +27,7 @@ export class DiscordBot {
     this.bot.on("typingStop", (c, u) => { this.OnTyping(c, u, false); });
     this.bot.on("userUpdate", (_, newUser) => { this.UpdateUser(newUser); });
     this.bot.on("channelUpdate", (_, newChannel) => { this.UpdateRoom(<Discord.TextChannel> newChannel); });
+    this.bot.on("presenceUpdate", (_, newMember) => { this.UpdatePresence(newMember); });
     this.bot.on("message", this.OnMessage.bind(this));
     this.bot.login(this.config.auth.botToken);
   }
@@ -186,6 +187,23 @@ export class DiscordBot {
     });
   }
 
+  private UpdatePresence(guildMember: Discord.GuildMember) {
+    log.info("DiscordBot", `Updating presence for ${guildMember.user.username}#${guildMember.user.discriminator}`);
+    const intent = this.bridge.getIntentFromLocalpart(`_discord_${guildMember.id}`);
+    try {
+      let presence = guildMember.presence.status;
+      if (presence === "idle" || presence === "dnd") {
+        presence = "unavailable";
+      }
+      intent.getClient().setPresence({
+        presence,
+      });
+    } catch (err) {
+      log.info("DiscordBot", "Couldn't set presence ", err);
+    }
+    // TODO: Set nicknames inside the scope of guild chats.
+  }
+
   private OnTyping(channel: Discord.Channel, user: Discord.User, isTyping: boolean) {
     this.GetRoomIdFromChannel(channel).then((room) => {
       const intent = this.bridge.getIntentFromLocalpart(`_discord_${user.id}`);
-- 
GitLab