Add MatrixSender class for sending messages

This commit is contained in:
Half-Shot 2019-08-08 14:38:57 +01:00
parent 665214e52f
commit 6c68bc0276
2 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,18 @@
import { parseConfig, parseRegistrationFile } from "../Config";
import { MatrixSender } from "../MatrixSender";
import { LogWrapper } from "../LogWrapper";
const log = new LogWrapper("App");
async function start() {
const configFile = process.argv[2] || "./config.yml";
const registrationFile = process.argv[3] || "./registration.yml";
const config = await parseConfig(configFile, process.env);
const registration = await parseRegistrationFile(registrationFile);
LogWrapper.configureLogging(config.logging.level);
new MatrixSender(config, registration).listen();
}
start().catch((ex) => {
log.error("MatrixSenderApp encountered an error and has stopped:", ex);
});

58
src/MatrixSender.ts Normal file
View File

@ -0,0 +1,58 @@
import { BridgeConfig } from "./Config";
import { MessageQueue, createMessageQueue } from "./MessageQueue/MessageQueue";
import { MatrixEventContent } from "./MatrixEvent";
import { Appservice, IAppserviceRegistration } from "matrix-bot-sdk";
import { LogWrapper } from "./LogWrapper";
export interface IMatrixSendMessage {
sender: string|null;
type: string;
roomId: string;
content: MatrixEventContent;
}
export interface IMatrixSendMessageResponse {
eventId: string;
}
const log = new LogWrapper("MatrixSender");
export class MatrixSender {
private mq: MessageQueue;
private as: Appservice;
constructor(private config: BridgeConfig, registration: IAppserviceRegistration) {
this.mq = createMessageQueue(this.config);
this.as = new Appservice({
homeserverName: this.config.bridge.domain,
homeserverUrl: this.config.bridge.url,
port: 0,
bindAddress: "",
registration,
});
}
public listen() {
this.mq.subscribe("matrix.message");
this.mq.on<IMatrixSendMessage>("matrix.message", async (msg) => {
try {
await this.sendMatrixMessage(msg.messageId!, msg.data);
} catch (ex) {
log.error(`Failed to send message (${msg.data.roomId}, ${msg.data.sender}, ${msg.data.type})`);
}
});
}
public async sendMatrixMessage(messageId: string, msg: IMatrixSendMessage) {
const intent = msg.sender ? this.as.getIntentForUserId(msg.sender) : this.as.botIntent;
const eventId = await intent.underlyingClient.sendEvent(msg.roomId, msg.type, msg.content);
log.info("Sent", eventId);
this.mq.push<IMatrixSendMessageResponse>({
eventName: "response.matrix.message",
sender: "MatrixSender",
data: {
eventId,
},
messageId,
});
}
}