diff --git a/src/discordbot.ts b/src/discordbot.ts index bd41e2213c3e19f7fb6369f0e187839393a77512..e9b385adffdd1e7723317688429357a0c564c1bb 100644 --- a/src/discordbot.ts +++ b/src/discordbot.ts @@ -1,10 +1,13 @@ import { DiscordBridgeConfig } from "./config"; import * as Discord from "discord.js"; import * as log from "npmlog"; +import { MatrixUser, RemoteUser } from "matrix-appservice-bridge"; +import { Util } from "./util"; export class DiscordBot { private config: DiscordBridgeConfig; private bot: Discord.Client; + private discord_user: Discord.ClientUser; private bridge; constructor(config: DiscordBridgeConfig, bridge) { this.config = config; @@ -22,7 +25,12 @@ export class DiscordBot { this.bot.on("typingStop", (c, u) => { this.OnTyping(c, u, false); }); // create an event listener for messages this.bot.on("message", (msg) => { - this.GetRoomIdFromChannel(msg.channel).then((room) => { + if (msg.author.id === this.bot.user.id) { + return; // Skip *our* messages + } + this.UpdateUser(msg.author).then(() => { + return this.GetRoomIdFromChannel(msg.channel); + }).then((room) => { const intent = this.bridge.getIntentFromLocalpart(`_discord_${msg.author.id}`); intent.sendText(room, msg.content); }); @@ -31,30 +39,11 @@ export class DiscordBot { this.bot.login(this.config.auth.botToken); } - private GetRoomIdFromChannel(channel: Discord.Channel): Promise<string> { - return this.bridge.getRoomStore().getEntriesByRemoteRoomData({ - discord_channel: channel.id, - }).then((rooms) => { - if (rooms.length === 0) { - log.warn("DiscordBot", `Got message but couldn't find room chan id:${channel.id} for it.`); - return Promise.reject("Room not found."); - } - return rooms[0].matrix.getId(); - }); - } - - private OnTyping(channel: Discord.Channel, user: Discord.User, isTyping: boolean) { - this.GetRoomIdFromChannel(channel).then((room) => { - const intent = this.bridge.getIntentFromLocalpart(`_discord_${user.id}`); - intent.sendTyping(room, isTyping); - }); - - } - public GetBot (): Discord.Client { return this.bot; } + public LookupRoom (server: string, room: string): Promise<Discord.TextChannel> { const guild = this.bot.guilds.find((g) => { return (g.id === server || g.name.replace(" ", "-") === server); @@ -108,4 +97,64 @@ export class DiscordBot { public OnUserQuery (userId: string): any { return false; } + + private GetRoomIdFromChannel(channel: Discord.Channel): Promise<string> { + return this.bridge.getRoomStore().getEntriesByRemoteRoomData({ + discord_channel: channel.id, + }).then((rooms) => { + if (rooms.length === 0) { + log.warn("DiscordBot", `Got message but couldn't find room chan id:${channel.id} for it.`); + return Promise.reject("Room not found."); + } + return rooms[0].matrix.getId(); + }); + } + + private UpdateUser(discordUser: Discord.User) { + let remoteUser: RemoteUser; + const displayName = discordUser.username + "#" + discordUser.discriminator; + const id = `_discord_${discordUser.id}:${this.config.bridge.domain}`; + const intent = this.bridge.getIntent("@"+id); + const userStore = this.bridge.getUserStore(); + + return userStore.getRemoteUser(discordUser.id).then((u) => { + remoteUser = u; + console.log(remoteUser); + if (remoteUser === null) { + remoteUser = new RemoteUser(discordUser.id); + return userStore.linkUsers( + new MatrixUser(id), + remoteUser + ); + } + return Promise.resolve(); + }).then(() => { + console.log(remoteUser.get("displayname"), "!==", displayName); + if (remoteUser.get("displayname") !== displayName) { + return intent.setDisplayName(displayName).then(() => { + remoteUser.set("displayname", displayName); + return userStore.setRemoteUser(remoteUser); + }); + } + return true; + }).then(() => { + console.log(remoteUser.get("avatarurl"), "!==", discordUser.avatarURL); + if (remoteUser.get("avatarurl") !== discordUser.avatarURL && discordUser.avatarURL !== null) { + return Util.uploadContentFromUrl(this.bridge, discordUser.avatarURL, intent, discordUser.avatar).then((avatar) => { + intent.setAvatarUrl(avatar.mxc_url).then(() => { + remoteUser.set("avatarurl", discordUser.avatarURL); + return userStore.setRemoteUser(remoteUser); + }); + }); + } + return true; + }); + } + + private OnTyping(channel: Discord.Channel, user: Discord.User, isTyping: boolean) { + this.GetRoomIdFromChannel(channel).then((room) => { + const intent = this.bridge.getIntentFromLocalpart(`_discord_${user.id}`); + intent.sendTyping(room, isTyping); + }); + } }