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