aboutsummarylogtreecommitdiffstats
path: root/deadletter.patch
blob: 7e19786e280274b040ab1da30da1ab581281d8b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
diff --git a/chat/conversations.ts b/chat/conversations.ts
index 148ebc9..00220a2 100644
--- a/chat/conversations.ts
+++ b/chat/conversations.ts
@@ -13,6 +13,8 @@ import throat from 'throat';
 import Bluebird from 'bluebird';
 import log from 'electron-log';
 import isChannel = Interfaces.isChannel;
+import path from 'path';
+import fs from 'fs';
 
 function createMessage(this: any, type: MessageType, sender: Character, text: string, time?: Date): Message {
     if(type === MessageType.Message && isAction(text)) {
@@ -746,6 +748,32 @@ export default function(this: any): Interfaces.State {
              state.selectedConversation.lastRead = state.selectedConversation.messages[state.selectedConversation.messages.length - 1];
     });
     const connection = core.connection;
+    connection.onEvent('closed', (_) => {
+        log.warn('Connection is closing. We are going to panic-save all channels containing unsent text.');
+        let logLocation = core.state.generalSettings!.logDirectory;
+        fs.mkdirSync(logLocation, {recursive: true});
+
+        let collectedLogs: string[][] = [];
+        for (let channelConversation of state.channelConversations) {
+            let conversationName = channelConversation.channel.name;
+            let enteredText = channelConversation.enteredText;
+            if (enteredText != '') {
+                collectedLogs.push([conversationName, enteredText]);
+            }
+        }
+        if (collectedLogs.length > 0) {
+            let deadLetterPath = path.join(logLocation, 'deadletter.log');
+            log.warn(`We found unsent messages. They will be written to \`${deadLetterPath}\``);
+            let deadLetterFile = fs.openSync(deadLetterPath, 'a');
+            let now = new Date();
+            fs.writeSync(deadLetterFile, `### ${now} ###\n`);
+            for (let [conversationName, enteredText] of collectedLogs) {
+                fs.writeSync(deadLetterFile, `=== ${conversationName} ===\n${enteredText}\n`);
+            }
+            fs.closeSync(deadLetterFile);
+        }
+        
+    });
     connection.onEvent('connecting', async(isReconnect) => {
         state.channelConversations = [];
         state.channelMap = {};