diff --git a/README.md b/README.md index 333727f..fdd7285 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ That said, it is usable for basic chatting. | Channel kicks | ✅ | ❌ || | Channel bans | 🟨 | ❌ | Bans show up on IRC as kicks | | Channel invites | ✅ | ❌ || -| Channel topics | ❌ | ❌ || +| Channel topics | ✅ | ❌ || | Channel powers | ❌ | ❌ || | Encrypted rooms | ❌ | ❌ || | Message replies (IRCv3) | ❌ | ❌ || diff --git a/src/Channel.ts b/src/Channel.ts index 6be3fe0..b2eeeaf 100644 --- a/src/Channel.ts +++ b/src/Channel.ts @@ -266,8 +266,22 @@ export class Channel { } handleMatrixTopic(event: any) { - this.topic.set("text", event["content"]["topic"]); - this.topic.set("timestamp", event["origin_server_ts"].toString()) + const topicText = event["content"]?.["topic"]; + if (!topicText) + return; + const topicSetter = this.server.getOrCreateMatrixUser(event["sender"]); + const topicTS: string = event["origin_server_ts"].toString(); + this.topic.set("text", topicText); + this.topic.set("timestamp", topicTS.substring(0,10)) + this.topic.set('setter', topicSetter.nick); + + const messageTags = new Map(); + messageTags.set('msgid', event["event_id"]); + messageTags.set('account', topicSetter.accountName); + messageTags.set('time', new Date(event["origin_server_ts"]).toISOString()) + this.ircUsers.forEach((user) => { + user.sendToAll(topicSetter.getMask(), 'TOPIC', [this.name, topicText], messageTags); + }); } handleMatrixJoinRule(event: any) {