diff --git a/src/Channel.ts b/src/Channel.ts index 3f8e1bf..482bc88 100644 --- a/src/Channel.ts +++ b/src/Channel.ts @@ -135,6 +135,7 @@ export class Channel { return; this.eventIDsSeen.add(event["event_id"]); this.handleMatrixMessage(event); + break; } case 'm.room.power_levels': this.handleMatrixPL(event); @@ -149,6 +150,9 @@ export class Channel { } joinMatrixUser(matrixUser: MatrixUser, event: any) { + // During initial sync, all past/present members are returned, so we filter out non-joined members + if (event["content"]["membership"] !== "join" && !this.matrixUsers.has(matrixUser.nick)) + return; this.matrixUsers.set(matrixUser.nick, matrixUser); const prefix = matrixUser.getMask(); if (event) { diff --git a/src/Client.ts b/src/Client.ts index c457e5a..04a393b 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -262,7 +262,7 @@ export class Client { }) const newMsg = new IRCMessage(ourTags, prefix, command, params); const msgToSend = newMsg.toString(); - console.log(`SENT: ${msgToSend}`); + //console.log(`SENT: ${msgToSend}`); this.socket.write(`${msgToSend}\r\n`); } diff --git a/src/IRCUser.ts b/src/IRCUser.ts index 22f65d3..9bbfd74 100644 --- a/src/IRCUser.ts +++ b/src/IRCUser.ts @@ -14,6 +14,7 @@ export class IRCUser { private txnIdStore: Set public nextBatch: string private initialSync: boolean + private syncIntervalID: NodeJS.Timeout; constructor(public mxid: string, private accessToken: string, private server: Server) { this.clients = new Set(); this.channels = new Map(); @@ -26,10 +27,11 @@ export class IRCUser { this.txnIdStore = new Set(); this.nextBatch = ""; this.initialSync = false; + this.syncIntervalID = setInterval(this.doSync.bind(this), 15000); } isSynced() { - return this.initialSync; + return this.nextBatch !== ""; } getVerification() { @@ -53,15 +55,21 @@ export class IRCUser { } doSync(): void { + if (!this.isSynced()) { + console.log("not syncing, initial sync not completed"); + return; + } const endpoint = `https://matrix.org/_matrix/client/v3/sync?access_token=${this.accessToken}&since=${this.nextBatch}`; axios.get(endpoint).then(response => { const data = response.data; this.nextBatch = data.next_batch; const rooms = data.rooms; - if (rooms['join']) { + if (rooms && rooms['join']) { for (const roomId of Object.keys(rooms.join)) { const targetChannel = this.server.matrixRooms.get(roomId) || new Channel(roomId, this.server); - rooms.join[roomId].state.events.forEach((nextEvent: any) => targetChannel.routeMatrixEvent(nextEvent)); + rooms.join[roomId].timeline.events.forEach((nextEvent: any) => { + targetChannel.routeMatrixEvent(nextEvent) + }); } } }) diff --git a/src/Message.ts b/src/Message.ts index ae6b455..52ec361 100644 --- a/src/Message.ts +++ b/src/Message.ts @@ -72,7 +72,7 @@ function addToTags(key: string): boolean { } export function parseIRCMessage(rawLine: string) { - console.log(`RAW: ${rawLine}`); + //console.log(`RAW: ${rawLine}`); let restOfMessage = rawLine; let parsedTags: Map = new Map(); let prefix = ''; @@ -118,6 +118,6 @@ export function parseIRCMessage(rawLine: string) { if (lastParam !== '') { params.push(lastParam); } - console.log(parsedTags, prefix, command, params); + //console.log(parsedTags, prefix, command, params); return new IRCMessage(parsedTags, prefix, command, params); } \ No newline at end of file