Sélectionner une révision Git
bot.ts 20,23 Kio
import { DiscordBridgeConfig } from "./config";
import { DiscordClientFactory } from "./clientfactory";
import { DiscordStore } from "./store";
import { DbGuildEmoji } from "./db/dbdataemoji";
import { DbEvent } from "./db/dbdataevent";
import { MatrixUser, RemoteUser, Bridge, Entry } from "matrix-appservice-bridge";
import { Util } from "./util";
import { MessageProcessor, MessageProcessorOpts } from "./messageprocessor";
import * as Discord from "discord.js";
import * as log from "npmlog";
import * as Bluebird from "bluebird";
import * as mime from "mime";
import * as path from "path";
import * as escapeStringRegexp from "escape-string-regexp";
// Due to messages often arriving before we get a response from the send call,
// messages get delayed from discord.
const MSG_PROCESS_DELAY = 750;
const PRESENCE_UPDATE_DELAY = 55000; // Synapse updates in 55 second intervals.
class ChannelLookupResult {
public channel: Discord.TextChannel;
public botUser: boolean;
}
export class DiscordBot {
private config: DiscordBridgeConfig;
private clientFactory: DiscordClientFactory;
private store: DiscordStore;
private bot: Discord.Client;
private bridge: Bridge;
private presenceInterval: any;
private sentMessages: string[];
private msgProcessor: MessageProcessor;
constructor(config: DiscordBridgeConfig, store: DiscordStore) {
this.config = config;
this.store = store;
this.sentMessages = [];
this.clientFactory = new DiscordClientFactory(store, config.auth);
this.msgProcessor = new MessageProcessor(
new MessageProcessorOpts(this.config.bridge.domain),
this,
);
}
public setBridge(bridge: Bridge) {
this.bridge = bridge;
}
get ClientFactory(): DiscordClientFactory {
return this.clientFactory;
}
public run (): Promise<null> {
return this.clientFactory.init().then(() => {
return this.clientFactory.getClient();
}).then((client: any) => {
client.on("typingStart", (c, u) => { this.OnTyping(c, u, true); });
client.on("typingStop", (c, u) => { this.OnTyping(c, u, false); });
client.on("userUpdate", (_, newUser) => { this.UpdateUser(newUser); });
client.on("channelUpdate", (_, newChannel) => { this.UpdateRooms(newChannel); });
client.on("presenceUpdate", (_, newMember) => { this.UpdatePresence(newMember); });
client.on("guildMemberAdd", (newMember) => { this.AddGuildMember(newMember); });
client.on("guildMemberRemove", (oldMember) => { this.RemoveGuildMember(oldMember); });
client.on("guildMemberUpdate", (_, newMember) => { this.UpdateGuildMember(newMember); });
client.on("message", (msg) => { Bluebird.delay(MSG_PROCESS_DELAY).then(() => {
this.OnMessage(msg);
});
});
log.info("DiscordBot", "Discord bot client logged in.");
this.bot = client;