1+ const express = require ( "express" ) ;
2+ const http = require ( "http" ) ;
3+ const cors = require ( "cors" ) ;
4+ const { Server } = require ( "socket.io" ) ;
5+
6+ const app = express ( ) ;
7+
8+ app . use ( cors ( ) ) ;
9+ app . use ( express . json ( ) ) ;
10+
11+ const server = http . createServer ( app ) ;
12+
13+ const io = new Server ( server , {
14+ cors : {
15+ origin : "*" ,
16+ } ,
17+ } ) ;
18+
19+ // Store messages in memory
20+ let messages = [ ] ;
21+
22+ // Track online users
23+ let onlineUsers = [ ] ;
24+
25+ io . on ( "connection" , ( socket ) => {
26+
27+ // delete messages
28+ socket . on ( "delete_message" , ( id ) => {
29+
30+ // remove message from array
31+ messages = messages . filter (
32+ ( msg ) => msg . id !== id
33+ ) ;
34+
35+ // notify all clients
36+ io . emit ( "message_deleted" , id ) ;
37+ } ) ;
38+
39+ console . log ( "User connected" ) ;
40+
41+ // Send old messages
42+ socket . emit ( "load_messages" , messages ) ;
43+
44+
45+ // USER JOIN
46+
47+ socket . on ( "join" , ( username ) => {
48+ socket . username = username ;
49+
50+ if (
51+ username && ! onlineUsers . includes ( username )
52+ ) {
53+ onlineUsers . push ( username ) ;
54+ }
55+
56+ io . emit ( "online_users" , onlineUsers ) ;
57+ } ) ;
58+
59+
60+ // TYPING INDICATOR
61+
62+ socket . on ( "typing" , ( username ) => {
63+ socket . broadcast . emit (
64+ "typing" ,
65+ username
66+ ) ;
67+ } ) ;
68+
69+
70+ // SEND MESSAGE
71+
72+ socket . on ( "send_message" , ( message ) => {
73+ const newMessage = {
74+ id : Date . now ( ) ,
75+
76+ text : message . text ,
77+ user : message . user ,
78+ color : message . color ,
79+
80+ likes : 0 ,
81+ dislikes : 0 ,
82+
83+ replyTo : message . replyTo || null ,
84+
85+ createdAt : new Date ( ) ,
86+ } ;
87+
88+
89+ // SCHEDULED MESSAGE
90+
91+ if ( message . scheduledFor ) {
92+
93+ const delay = new Date ( message . scheduledFor ) - new Date ( ) ;
94+
95+ setTimeout ( ( ) => {
96+ messages . push ( newMessage ) ;
97+ io . emit (
98+ "receive_message" ,
99+ newMessage
100+ ) ;
101+
102+ } , delay ) ;
103+
104+ } else {
105+
106+ messages . push ( newMessage ) ;
107+
108+ io . emit (
109+ "receive_message" ,
110+ newMessage
111+ ) ;
112+ }
113+ } ) ;
114+
115+
116+ // LIKE MESSAGE
117+
118+ socket . on ( "like_message" , ( id ) => {
119+ const msg = messages . find ( ( m ) => m . id === id
120+ ) ;
121+ if ( msg ) {
122+ msg . likes ++ ; io . emit (
123+ "update_message" ,
124+ msg
125+ ) ;
126+ }
127+ } ) ;
128+
129+
130+ // DISLIKE MESSAGE
131+
132+ socket . on ( "dislike_message" , ( id ) => {
133+
134+ const msg = messages . find (
135+ ( m ) => m . id === id
136+ ) ;
137+
138+ if ( msg ) {
139+
140+ msg . dislikes ++ ;
141+
142+ io . emit (
143+ "update_message" ,
144+ msg
145+ ) ;
146+ }
147+ } ) ;
148+
149+
150+ // DISCONNECT
151+
152+ socket . on ( "disconnect" , ( ) => {
153+ onlineUsers =
154+ onlineUsers . filter ( ( user ) => user !== socket . username
155+ ) ;
156+
157+ io . emit ( "online_users" , onlineUsers
158+ ) ;
159+
160+ console . log ( "User disconnected" ) ;
161+ } ) ;
162+ } ) ;
163+
164+ server . listen ( 5000 , ( ) => {
165+ console . log (
166+ "Server running on port 5000"
167+ ) ;
168+ } ) ;
0 commit comments