From 20fe6b4233ac42e156fb7bae88b18ac956d9c1bc Mon Sep 17 00:00:00 2001 From: Sorunome <mail@sorunome.de> Date: Fri, 26 Apr 2019 17:58:00 +0200 Subject: [PATCH] add name tags --- config/config.sample.yaml | 3 +++ config/config.schema.yaml | 5 +++++ src/config.ts | 5 +++++ src/usersyncroniser.ts | 5 +++-- test/test_usersyncroniser.ts | 36 +++++++++++++++++++++++++++++++++++- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/config/config.sample.yaml b/config/config.sample.yaml index ed97ed4..7b3680e 100644 --- a/config/config.sample.yaml +++ b/config/config.sample.yaml @@ -89,3 +89,6 @@ limits: # (Copies of a sent message may arrive from discord before we've # fininished handling it, causing us to echo it back to the room) discordSendDelay: 750 +ghosts: + # the tag to append to ghost nicknames + tag: "" diff --git a/config/config.schema.yaml b/config/config.schema.yaml index 9a35f4b..68ecba2 100644 --- a/config/config.schema.yaml +++ b/config/config.schema.yaml @@ -109,3 +109,8 @@ properties: type: "boolean" ghostsLeave: type: "boolean" + ghosts: + type: "object" + properties: + tag: + type: "string" diff --git a/src/config.ts b/src/config.ts index 3fdde89..b54ca4c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -23,6 +23,7 @@ export class DiscordBridgeConfig { public room: DiscordBridgeConfigRoom = new DiscordBridgeConfigRoom(); public channel: DiscordBridgeConfigChannel = new DiscordBridgeConfigChannel(); public limits: DiscordBridgeConfigLimits = new DiscordBridgeConfigLimits(); + public ghosts: DiscordBridgeConfigGhosts = new DiscordBridgeConfigGhosts(); /** * Apply a set of keys and values over the default config. @@ -109,3 +110,7 @@ export class LoggingFile { public enabled: string[] = []; public disabled: string[] = []; } + +class DiscordBridgeConfigGhosts { + public tag: string = ""; +} diff --git a/src/usersyncroniser.ts b/src/usersyncroniser.ts index 3a329a3..2af4dac 100644 --- a/src/usersyncroniser.ts +++ b/src/usersyncroniser.ts @@ -234,7 +234,8 @@ export class UserSyncroniser { id: discordUser.id, mxUserId: `@_discord_${discordUser.id}${mxidExtra}:${this.config.bridge.domain}`, }); - const displayName = this.displayNameForUser(discordUser); + const displayName = this.displayNameForUser(discordUser) + + (this.config.ghosts.tag ? " " + this.config.ghosts.tag : ""); // Determine if the user exists. const remoteId = discordUser.id + mxidExtra; const remoteUser = await this.userStore.getRemoteUser(remoteId); @@ -273,7 +274,7 @@ export class UserSyncroniser { const guildState: IGuildMemberState = Object.assign({}, DEFAULT_GUILD_STATE, { bot: newMember.user.bot, displayColor: newMember.displayColor, - displayName: newMember.displayName, + displayName: newMember.displayName + (this.config.ghosts.tag ? " " + this.config.ghosts.tag : ""), id: newMember.id, mxUserId: `@_discord_${newMember.id}:${this.config.bridge.domain}`, roles: newMember.roles.map((role) => { return { diff --git a/test/test_usersyncroniser.ts b/test/test_usersyncroniser.ts index c5b7b1c..2984d29 100644 --- a/test/test_usersyncroniser.ts +++ b/test/test_usersyncroniser.ts @@ -64,7 +64,7 @@ const UserSync = (Proxyquire("../src/usersyncroniser", { }, })).UserSyncroniser; -function CreateUserSync(remoteUsers: RemoteUser[] = []): UserSyncroniser { +function CreateUserSync(remoteUsers: RemoteUser[] = [], nickTag: string = ""): UserSyncroniser { UTIL_UPLOADED_AVATAR = false; SEV_ROOM_ID = null; SEV_CONTENT = null; @@ -153,6 +153,7 @@ function CreateUserSync(remoteUsers: RemoteUser[] = []): UserSyncroniser { }; const config = new DiscordBridgeConfig(); config.bridge.domain = "localhost"; + config.ghosts.tag = nickTag; return new UserSync(bridge as Bridge, config, discordbot, userStore as any); } @@ -196,6 +197,27 @@ describe("UserSyncroniser", () => { expect(state.avatarId, "AvatarID").is.empty; expect(state.avatarUrl, "AvatarUrl").is.null; }); + it("Will obay name tags", async () => { + const remoteUser = new RemoteUser("123456"); + remoteUser.avatarurl = "test.jpg"; + remoteUser.displayname = "TestUsername"; + + const userSync = CreateUserSync([remoteUser], "(Discord)"); + const user = new MockUser( + "123456", + "TestUsername", + "6969", + "test.jpg", + "111", + ); + const state = await userSync.GetUserUpdateState(user as any); + expect(state.createUser, "CreateUser").is.false; + expect(state.removeAvatar, "RemoveAvatar").is.false; + expect(state.displayName, "DisplayName").equals("TestUsername#6969 (Discord)"); + expect(state.mxUserId , "UserId").equals("@_discord_123456:localhost"); + expect(state.avatarId, "AvatarID").is.empty; + expect(state.avatarUrl, "AvatarUrl").is.null; + }); it("Will change avatars", async () => { const remoteUser = new RemoteUser("123456"); remoteUser.avatarurl = "test.jpg"; @@ -467,6 +489,18 @@ describe("UserSyncroniser", () => { const state = await userSync.GetUserStateForGuildMember(member as any); expect(state.displayName).to.be.equal("BestDog"); }); + it("Will will obay name tags", async () => { + const userSync = CreateUserSync([new RemoteUser("123456")], "(Discord)"); + const guild = new MockGuild( + "654321"); + const member = new MockMember( + "123456", + "username", + guild, + "BestDog"); + const state = await userSync.GetUserStateForGuildMember(member as any); + expect(state.displayName).to.be.equal("BestDog (Discord)"); + }); it("Will correctly add roles", async () => { const userSync = CreateUserSync([new RemoteUser("123456")]); const guild = new MockGuild( -- GitLab