Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -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(() => {
Expand Down
16 changes: 8 additions & 8 deletions models/channel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ interface IMessage {
created_at: Date;
}

interface IDirectMessage {
sender: string;
interface IDirectMessages {
owner: string;
message: string;
external_user: string;
messages: Array<IMessage>;
created_at: Date;
}

Expand All @@ -35,14 +35,14 @@ const channelSchema = new Schema<IChannel>({
active: { type: Boolean, default: true }
});

const directMessageSchema = new Schema<IDirectMessage>({
const directMessageSchema = new Schema<IDirectMessages>({
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<IMessage>({ sender: String, message: String, created_at: { type: Date, default: Date.now } })], default: [] },
created_at: { type: Date, default: Date.now }
});

const Channel = model<IChannel>('Channel', channelSchema);
const DirectMessage = model<IDirectMessage>('DirectMessage', directMessageSchema);
const DirectMessages = model<IDirectMessages>('DirectMessages', directMessageSchema);

export { Channel, DirectMessage, IChannel, IMessage, IDirectMessage };
export { Channel, DirectMessages, IChannel, IMessage, IDirectMessages };
2 changes: 1 addition & 1 deletion public/login/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ <h1 class="text-xl mb-8">Login</h1>
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) => {
Expand Down
15 changes: 13 additions & 2 deletions public/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,20 +143,31 @@ 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('<li class="flex items-center space-x-4"><i class="fas fa-user"></i><span class="text-sm font-medium">' + user.nick + ' [' + user.modes + ']</span></li>');
$('#users').append('<li class="flex items-center space-x-4"onclick="openDirectMessage(\''
+ user.user + '\')"><i class="fas fa-user"></i><span class="text-sm font-medium">'
+ user.nick + ' [' + user.modes + ']</span></li>');
});
$('#channel_name').text('ChanServe');
selectedChannel = 'ChanServe';
$('#messages').animate({ scrollTop: $('#messages').prop("scrollHeight")}, 10);
});

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('<li class="flex items-center space-x-4"><i class="fas fa-user"></i><span class="text-sm font-medium">' + user.nick + ' [' + user.modes + ']</span></li>');
$('#users').append('<li class="flex items-center space-x-4"onclick="openDirectMessage(\''
+ user.nick + '\')"><i class="fas fa-user"></i><span class="text-sm font-medium">'
+ user.nick + ' [' + user.modes + ']</span></li>');
});
// add to channels if not exists
if(!channels.filter(channel => channel.name == data.channel).length > 0){
Expand Down
18 changes: 11 additions & 7 deletions services/mongo.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -31,19 +31,23 @@ 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 });
},
getMessagesForChannel: async (channelName: string) => {
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);
Expand Down
34 changes: 16 additions & 18 deletions services/socket.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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);
});

});
Expand All @@ -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", {
Expand Down