From d59c3f9f52d95a01855f5e6dc5d25f08d1df852b Mon Sep 17 00:00:00 2001 From: Will Hunt <half-shot@molrams.com> Date: Wed, 1 Mar 2017 22:49:29 +0000 Subject: [PATCH] Do a better job at attachment names. --- src/{discordbot.ts => bot.ts} | 19 +++++++++++--- ...scordclientfactory.ts => clientfactory.ts} | 10 +++++--- src/dbschema/dbschema.ts | 2 +- src/dbschema/v1.ts | 2 +- src/discordas.ts | 6 ++--- src/matrixroomhandler.ts | 4 +-- src/{discordstore.ts => store.ts} | 25 +++++++++++++++---- 7 files changed, 49 insertions(+), 19 deletions(-) rename src/{discordbot.ts => bot.ts} (95%) rename src/{discordclientfactory.ts => clientfactory.ts} (92%) rename src/{discordstore.ts => store.ts} (88%) diff --git a/src/discordbot.ts b/src/bot.ts similarity index 95% rename from src/discordbot.ts rename to src/bot.ts index 9379a2d..43d93e2 100644 --- a/src/discordbot.ts +++ b/src/bot.ts @@ -1,6 +1,7 @@ import { DiscordBridgeConfig } from "./config"; -import { DiscordClientFactory } from "./discordclientfactory"; -import { DiscordStore } from "./discordstore"; +import { DiscordClientFactory } from "./clientfactory"; +import { DiscordStore } from "./store"; +import { DiscordDMHandler } from "./dmhandler"; import { MatrixUser, RemoteUser, Bridge, RemoteRoom } from "matrix-appservice-bridge"; import { Util } from "./util"; import * as Discord from "discord.js"; @@ -8,6 +9,7 @@ import * as log from "npmlog"; import * as Bluebird from "bluebird"; import * as mime from "mime"; import * as marked from "marked"; +import * as path from "path"; // Due to messages often arriving before we get a response from the send call, // messages get delayed from discord. @@ -149,9 +151,10 @@ export class DiscordBot { return Promise.resolve(null); }).then((attachment) => { if (attachment !== null) { + let name = this.GetFilenameForMediaEvent(event.content); return { file : { - name: event.content.body, + name, attachment, }, }; @@ -173,6 +176,16 @@ export class DiscordBot { return false; } + private GetFilenameForMediaEvent(content) { + if (content.body) { + if (path.extname(content.body) !== "") { + return content.body; + } + return path.basename(content.body) + "." + mime.extension(content.mimetype); + } + return "matrix-media." + mime.extension(content.mimetype); + } + private GetRoomIdFromChannel(channel: Discord.Channel): Promise<string> { return this.bridge.getRoomStore().getEntriesByRemoteRoomData({ discord_channel: channel.id, diff --git a/src/discordclientfactory.ts b/src/clientfactory.ts similarity index 92% rename from src/discordclientfactory.ts rename to src/clientfactory.ts index 461843e..f8e9958 100644 --- a/src/discordclientfactory.ts +++ b/src/clientfactory.ts @@ -1,5 +1,5 @@ import { DiscordBridgeConfigAuth } from "./config"; -import { DiscordStore } from "./discordstore"; +import { DiscordStore } from "./store"; import { Client } from "discord.js"; import * as log from "npmlog"; import * as Bluebird from "bluebird"; @@ -8,7 +8,7 @@ export class DiscordClientFactory { private config: DiscordBridgeConfigAuth; private store: DiscordStore; private botClient: any; - private clients: Map<string,any>; + private clients: Map<string, any>; constructor(config: DiscordBridgeConfigAuth, store: DiscordStore) { this.config = config; this.clients = new Map(); @@ -21,12 +21,13 @@ export class DiscordClientFactory { this.botClient = Bluebird.promisifyAll(new Client({ fetchAllMembers: true, sync: true, + messageCacheLifetime: 5, })); return this.botClient.login(this.config.botToken).then(() => { return null; // Strip token from promise. }).catch((err) => { log.error("ClientFactory", "Could not login as the bot user. This is bad!"); - }) + }); } public getClient(userId?: string): Promise<any> { @@ -43,6 +44,7 @@ export class DiscordClientFactory { client = Bluebird.promisifyAll(new Client({ fetchAllMembers: true, sync: true, + messageCacheLifetime: 5, })); log.verbose("ClientFactory", "Got user token. Logging in..."); return client.login(token).then(() => { @@ -51,7 +53,7 @@ export class DiscordClientFactory { return Promise.resolve(client); }).catch((err) => { log.warn("ClientFactory", `Could not log ${userId} in.`, err); - }) + }); }); // Get from cache } diff --git a/src/dbschema/dbschema.ts b/src/dbschema/dbschema.ts index e8b7cfd..ddb4310 100644 --- a/src/dbschema/dbschema.ts +++ b/src/dbschema/dbschema.ts @@ -1,4 +1,4 @@ -import { DiscordStore } from "../discordstore"; +import { DiscordStore } from "../store"; export interface IDbSchema { description: string, run(store: DiscordStore): Promise<null>; diff --git a/src/dbschema/v1.ts b/src/dbschema/v1.ts index 474544f..ca54262 100644 --- a/src/dbschema/v1.ts +++ b/src/dbschema/v1.ts @@ -1,5 +1,5 @@ import {IDbSchema} from "./dbschema"; -import {DiscordStore} from "../discordstore"; +import {DiscordStore} from "../store"; export class Schema implements IDbSchema { public description = "Schema, Client Auth Table"; public run(store: DiscordStore): Promise<null> { diff --git a/src/discordas.ts b/src/discordas.ts index 7d913fc..c8d6eb6 100644 --- a/src/discordas.ts +++ b/src/discordas.ts @@ -3,9 +3,9 @@ import * as log from "npmlog"; import * as yaml from "js-yaml"; import * as fs from "fs"; import { DiscordBridgeConfig } from "./config"; -import { DiscordBot } from "./discordbot"; +import { DiscordBot } from "./bot"; import { MatrixRoomHandler } from "./matrixroomhandler"; -import { DiscordStore } from "./discordstore"; +import { DiscordStore } from "./store"; const cli = new Cli({ bridgeConfig: { @@ -62,7 +62,7 @@ function run (port: number, config: DiscordBridgeConfig) { thirdPartyLookup: roomhandler.ThirdPartyLookup, onLog: (line, isError) => { log.verbose("matrix-appservice-bridge", line); - } + }, }, domain: config.bridge.domain, homeserverUrl: config.bridge.homeserverUrl, diff --git a/src/matrixroomhandler.ts b/src/matrixroomhandler.ts index a705064..d719cd0 100644 --- a/src/matrixroomhandler.ts +++ b/src/matrixroomhandler.ts @@ -1,4 +1,4 @@ -import { DiscordBot } from "./discordbot"; +import { DiscordBot } from "./bot"; import { Bridge, RemoteRoom, @@ -8,7 +8,7 @@ import { thirdPartyLocationResult, } from "matrix-appservice-bridge"; import { DiscordBridgeConfig } from "./config"; -import { DiscordClientFactory } from "./discordclientfactory"; +import { DiscordClientFactory } from "./clientfactory"; import * as Discord from "discord.js"; import * as log from "npmlog"; diff --git a/src/discordstore.ts b/src/store.ts similarity index 88% rename from src/discordstore.ts rename to src/store.ts index 83d9817..1c1799f 100644 --- a/src/discordstore.ts +++ b/src/store.ts @@ -74,8 +74,8 @@ export class DiscordStore { `REPLACE INTO user_tokens (userId,token) VALUES ($id,$token);` , { $id: userId, - $token: token - }).catch(err => { + $token: token, + }).catch( (err) => { log.error("TwitDB", "Error storing user token %s", err); throw err; }); @@ -90,10 +90,25 @@ export class DiscordStore { WHERE user_tokens.userId = $id; ` , { - $id: userId - }).then(row => { + $id: userId, + }).then( (row) => { return row !== undefined ? row.token : null; - }).catch( err => { + }).catch( (err) => { + log.error("TwitDB", "Error getting user token %s", err.Error); + throw err; + }); + } + + public get_users_tokens(): Promise<any> { + log.silly("SQL", "get_users_tokens"); + return this.db.allAsync( + ` + SELECT * + FROM user_tokens + `, + ).then( (rows) => { + return rows; + }).catch( (err) => { log.error("TwitDB", "Error getting user token %s", err.Error); throw err; }); -- GitLab