aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--webAO/client.js48
-rw-r--r--webAO/services/__tests__/downloadFile.test.ts27
-rw-r--r--webAO/services/downloadFile.ts8
3 files changed, 79 insertions, 4 deletions
diff --git a/webAO/client.js b/webAO/client.js
index 06defa2..7d6caab 100644
--- a/webAO/client.js
+++ b/webAO/client.js
@@ -29,7 +29,7 @@ import queryParser from './utils/queryParser.js';
import getAnimLength from './utils/getAnimLength.js';
import getResources from './utils/getResources.js';
import transparentPng from './constants/transparentPng';
-
+import downloadFile from './services/downloadFile'
const version = process.env.npm_package_version;
let client;
@@ -232,7 +232,21 @@ class Client extends EventEmitter {
setCookie('OOC_name', document.getElementById('OOC_name').value);
const oocName = `${escapeChat(encodeChat(document.getElementById('OOC_name').value))}`;
const oocMessage = `${escapeChat(encodeChat(message))}`;
- this.sendServer(`CT#${oocName}#${oocMessage}#%`);
+
+ const commands = {
+ '/save_chatlog': this.saveChatlogHandle
+ }
+ const commandsMap = new Map(Object.entries(commands))
+
+ if (oocMessage && commandsMap.has(oocMessage.toLowerCase())) {
+ try {
+ commandsMap.get(oocMessage.toLowerCase())()
+ } catch (e) {
+ // Command Not Recognized
+ }
+ } else {
+ this.sendServer(`CT#${oocName}#${oocMessage}#%`);
+ }
}
/**
@@ -559,11 +573,37 @@ class Client extends EventEmitter {
}
}
+ saveChatlogHandle = async () => {
+ const clientLog = document.getElementById('client_log')
+ const icMessageLogs = clientLog.getElementsByTagName('p')
+ const messages = []
+
+ for (let i = 0; i < icMessageLogs.length; i++) {
+ const SHOWNAME_POSITION = 0
+ const TEXT_POSITION = 2
+ const showname = icMessageLogs[i].children[SHOWNAME_POSITION].innerHTML
+ const text = icMessageLogs[i].children[TEXT_POSITION].innerHTML
+ const message = `${showname}: ${text}`
+ messages.push(message)
+ }
+ const d = new Date();
+ let ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d);
+ let mo = new Intl.DateTimeFormat('en', { month: 'short' }).format(d);
+ let da = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(d);
+
+ const filename = `chatlog-${da}-${mo}-${ye}`.toLowerCase()
+ downloadFile(messages.join('\n'), filename)
+
+ // Reset Chatbox to Empty
+ document.getElementById('client_inputbox').value = '';
+ }
+
/**
* Handles an in-character chat message.
* @param {*} args packet arguments
*/
handleMS(args) {
+
// TODO: this if-statement might be a bug.
if (args[4] !== viewport.chatmsg.content) {
document.getElementById('client_inner_chat').innerHTML = '';
@@ -699,8 +739,7 @@ class Client extends EventEmitter {
if (chatmsg.charid === this.charID) {
resetICParams();
}
-
- viewport.say(chatmsg); // no await
+ viewport.say(chatmsg); // no await
}
}
}
@@ -717,6 +756,7 @@ class Client extends EventEmitter {
oocLog.scrollTop = oocLog.scrollHeight;
}
}
+
}
/**
diff --git a/webAO/services/__tests__/downloadFile.test.ts b/webAO/services/__tests__/downloadFile.test.ts
new file mode 100644
index 0000000..b217b2c
--- /dev/null
+++ b/webAO/services/__tests__/downloadFile.test.ts
@@ -0,0 +1,27 @@
+import downloadFile from '../downloadFile'
+jest
+ .useFakeTimers()
+ .setSystemTime(new Date('2020-01-01').getTime());
+
+ global.URL.createObjectURL = jest.fn();
+(window as any).global.Blob = function (content, options){return ({content, options})}
+
+describe('downloadFile', () => {
+ it('Creates an <a> tag', () => {
+ const createElementSpy = jest.spyOn(document, 'createElement');
+ downloadFile('hi', 'filename')
+ expect(createElementSpy).toBeCalled()
+ })
+ it('Creates the blob with the correct data', () => {
+ const data = 'writingtestsishard'
+ global.URL.createObjectURL = jest.fn(() => data);
+ downloadFile(data, 'filename')
+ const expected = {
+ content: [data],
+ options: {
+ type: "text"
+ }
+ }
+ expect(global.URL.createObjectURL).toBeCalledWith(expected)
+ })
+}) \ No newline at end of file
diff --git a/webAO/services/downloadFile.ts b/webAO/services/downloadFile.ts
new file mode 100644
index 0000000..058075f
--- /dev/null
+++ b/webAO/services/downloadFile.ts
@@ -0,0 +1,8 @@
+const downloadFile = (content: string, filename: string) => {
+ const a = document.createElement('a');
+ const file = new Blob([content], {type: 'text'});
+ a.href= URL.createObjectURL(file);
+ a.download = filename;
+ a.click();
+}
+export default downloadFile \ No newline at end of file