diff --git a/main.ts b/main.ts index 81210f3..abb1802 100644 --- a/main.ts +++ b/main.ts @@ -44,7 +44,7 @@ app.use("/login", Express.static("public/login/login.html")); app.post("/join/dm/:nick", isLoggedIn, async (req, res) => { const nick = req.params.nick; var dms = await MongooseDal.getDirectMessagesForUser(UserSettings.nick, nick); - res.send({ nick: nick, messages: dms }); + res.send({ nick: nick, messages: dms?.messages || [] }); }); app.post("/channel/join", isLoggedIn, async (req, res) => { @@ -64,8 +64,6 @@ app.post("/channel/join", isLoggedIn, async (req, res) => { }; var channelMessages = await MongooseDal.getMessagesForChannel(req.body.channel); - - await MongooseDal.createChannel(channelMongo); channel.updateUsers(() => { diff --git a/models/channel.ts b/models/channel.ts index 6b1b8b8..e6cc07c 100644 --- a/models/channel.ts +++ b/models/channel.ts @@ -6,10 +6,10 @@ interface IMessage { created_at: Date; } -interface IDirectMessage { - sender: string; +interface IDirectMessages { owner: string; - message: string; + external_user: string; + messages: Array; created_at: Date; } @@ -35,14 +35,14 @@ const channelSchema = new Schema({ active: { type: Boolean, default: true } }); -const directMessageSchema = new Schema({ +const directMessageSchema = new Schema({ owner: { type: String, required: true }, - sender: { type: String, required: true }, - message: { type: String, required: true }, + external_user: { type: String, required: true }, + messages: { type: [new Schema({ sender: String, message: String, created_at: { type: Date, default: Date.now } })], default: [] }, created_at: { type: Date, default: Date.now } }); const Channel = model('Channel', channelSchema); -const DirectMessage = model('DirectMessage', directMessageSchema); +const DirectMessages = model('DirectMessages', directMessageSchema); -export { Channel, DirectMessage, IChannel, IMessage, IDirectMessage }; \ No newline at end of file +export { Channel, DirectMessages, IChannel, IMessage, IDirectMessages }; \ No newline at end of file diff --git a/public/login/login.html b/public/login/login.html index 61015d1..8dc5355 100644 --- a/public/login/login.html +++ b/public/login/login.html @@ -42,7 +42,7 @@

Login

var password = document.getElementById('password').value; // POST with axios to /login - axios.post('/user/login', { + axios.post('http://127.0.0.1:3000/user/login', { username: username, password: password }).then((response) => { diff --git a/public/main.js b/public/main.js index fbd57f0..6d6a3d0 100644 --- a/public/main.js +++ b/public/main.js @@ -143,8 +143,12 @@ socket.on('channel:list', function (data) { socket.on('channel:parted', function (data) { $('#users').empty(); $('#messages').empty(); + // Sort the users by their modes + data.users.sort((a, b) => (a.modes > b.modes ? 1 : -1)); $.each(data.users, function (index, user) { - $('#users').append('
  • ' + user.nick + ' [' + user.modes + ']
  • '); + $('#users').append('
  • ' + + user.nick + ' [' + user.modes + ']
  • '); }); $('#channel_name').text('ChanServe'); selectedChannel = 'ChanServe'; @@ -152,11 +156,18 @@ socket.on('channel:parted', function (data) { }); socket.on('channel:joined', function (data) { + if(!data.users || data.users.length <= 1){ + openDirectMessage(data.channel); + return; + } data.channel[0] == '#' ? selectedChannel = data.channel.substring(1) : selectedChannel = data.channel; $('#users').empty(); $('#messages').empty(); + data.users.sort((a, b) => (a.modes > b.modes ? 1 : -1)); $.each(data.users, function (index, user) { - $('#users').append('
  • ' + user.nick + ' [' + user.modes + ']
  • '); + $('#users').append('
  • ' + + user.nick + ' [' + user.modes + ']
  • '); }); // add to channels if not exists if(!channels.filter(channel => channel.name == data.channel).length > 0){ diff --git a/services/mongo.ts b/services/mongo.ts index 64a38a0..060bac1 100644 --- a/services/mongo.ts +++ b/services/mongo.ts @@ -1,6 +1,6 @@ // Mongoose controller import mongoose from "mongoose"; -import { Channel, DirectMessage, IChannel, IMessage, IDirectMessage } from "../models/channel"; +import { Channel, DirectMessages, IChannel, IMessage } from "../models/channel"; import { MessageQueue, IMessageQueue } from "../models/messageQueue"; // MONGODB MONGOOS DAL CLASS @@ -31,10 +31,6 @@ const MongooseDal = { return Channel.updateOne( { name: channelName }, { $push: { messages: message }, updated_at: new Date() }); }, - addDirectMessage: async (message: IDirectMessage) => { - console.log(message); - return await DirectMessage.create(message); - }, getChannelsForUser: async (username: string) => { return await Channel.find({ owner: username, active: true }, { name: 1, updated_at: 1 }); }, @@ -42,8 +38,16 @@ const MongooseDal = { var messages = await Channel.findOne({ name: channelName }, { messages: 1 }); return messages; }, - getDirectMessagesForUser: async (owner: string, sender: string) => { - return await DirectMessage.find({ owner, sender }); + getDirectMessagesForUser: async (owner: string, external_user: string) => { + return await DirectMessages.findOne({ owner, external_user }, { messages: 1 }); + }, + addDirectMessage: async (owner:string, external_user:string, message:IMessage) => { + const directMessage = await DirectMessages.findOne({ owner, external_user }); + if (!directMessage) { + return await DirectMessages.create({ owner, external_user, messages: [message] }); + } else { + return await DirectMessages.updateOne({ owner, external_user }, { $push: { messages: message } }); + } }, addMessageToQueue: async (message: IMessageQueue) => { return await MessageQueue.create(message); diff --git a/services/socket.ts b/services/socket.ts index d00744a..c3a3ae5 100644 --- a/services/socket.ts +++ b/services/socket.ts @@ -1,6 +1,6 @@ import { Client } from "irc-framework"; import { Server } from "socket.io"; -import { IDirectMessage, IMessage } from "../models/channel"; +import { IDirectMessages, IMessage } from "../models/channel"; import UserSettings from "../config"; import MongooseDal from "./mongo"; import Utils from "./utils"; @@ -52,15 +52,14 @@ export class SocketService { // Direct Message socket.on("client:direct", async (message) => { - const directMessage: IDirectMessage = { - sender: message.from, - owner: message.to, - message: message.message, - created_at: new Date(), - }; - - await MongooseDal.addDirectMessage(directMessage); - this.ircClient.say(message.to, message.message); + const owner = UserSettings.nick; // TODO : get session user + const directMessage: IMessage = { + sender: owner, + message: message.message, + created_at: new Date(), + }; + await MongooseDal.addDirectMessage(owner, message.to, directMessage); + this.ircClient.say(message.to, message.message); }); }); @@ -84,14 +83,13 @@ export class SocketService { } async sendDirectMessageAsync(message: string, nick: string) { - const directMessage: IDirectMessage = { - sender: nick, - owner: UserSettings.nick, - message: message, - created_at: new Date(), - }; - - await MongooseDal.addDirectMessage(directMessage); + const owner = UserSettings.nick; // TODO : get session user + const directMessage: IMessage = { + sender: nick, + message: message, + created_at: new Date(), + }; + await MongooseDal.addDirectMessage(owner, nick, directMessage); console.log("sending direct message to " + nick); this.io.emit("chat:direct", {