global chat via socket.io
[browser-rts.git] / src / api.ts
index 2cca2896156d71946885de1af5dd6747b3b89dee..87569fe59f10a6935c679a69663432998fc7bbf8 100644 (file)
@@ -18,13 +18,16 @@ import _ from 'lodash';
 import { renderCost } from './render/costs';
 import {renderMailroom, renderMessage} from './render/mail';
 import {topbar} from './render/topbar';
+import {renderPublicChatMessage} from './render/chat-message';
 
-const server = new HttpServer(config.API_PORT);
 
+const server = new HttpServer(config.API_PORT);
 const accountRepo = new AccountRepository();
 const cityRepo = new CityRepository();
 const mailRepo = new MailRepository();
 
+const msgBuffer: string[] = [];
+
 createBullBoard({
        queues: [
                new BullAdapter(tick.queue),
@@ -348,6 +351,29 @@ server.get<void, string>('/attacks/outgoing', async req => {
        return listOperations(attacks);
 });
 
+server.post<{body: {message: string}}, void>('/chat', async req => {
+  const acct = await accountRepo.validate(req.authInfo.accountId, req.authInfo.token);
+  const now = Date.now();
+
+  console.log(acct.username, req.body.message, now);
+
+  const msg = renderPublicChatMessage(acct.username, req.body.message);
+  server.ws.emit('/chat-message', msg);
+  msgBuffer.unshift(msg);
+  while(msgBuffer.length > 30) {
+    msgBuffer.pop();
+  }
+});
+
+server.ws.on('connection', async socket => {
+  const auth = server.authFromUrl(socket.request.headers['referer']);
+  const acct = await accountRepo.validate(auth.authInfo.accountId, auth.authInfo.token);
+
+  server.ws.emit('/chat-message', msgBuffer.join("\n"));
+
+  server.ws.emit('/chat-message', renderPublicChatMessage('Server', `${acct.username} logged in`));
+
+});
 
 server.start();