/
server.js
223 lines (207 loc) · 7.1 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
const express = require("express");
const app = express();
const http = require("http");
const server = http.createServer(app);
const session = require("express-session");
const { Server } = require("socket.io");
const io = new Server(server);
// Use session middleware
const sessionMiddleware = session({
secret: "secret-key",
resave: false,
saveUninitialized: true,
cookie: {
secure: false,
maxAge: 1000 * 60 * 60 * 24 * 7,
},
});
// Serve static files from the public directory
app.get("/", (req, res) => {
res.sendFile(__dirname + "/fastfood.html");
});
const fastFoods = {
11: "Fried Chicken",
12: "Burger",
13: "Pizza",
14: "Hot Dog",
15: "French Fries",
};
const orderHistory = [];
io.use((socket, next) => {
sessionMiddleware(socket.request, socket.request.res, next);
});
io.on("connection", (socket) => {
console.log("User connected:", socket.id);
// Get the unique identifier for the user's device
const deviceId = socket.handshake.headers["user-agent"];
// Check if the user already has an existing session
if (
socket.request.session[deviceId] &&
socket.request.session[deviceId].userName
) {
// If the user already has a session, use the existing user name and current order
socket.emit(
"bot-message",
`Welcome back, ${
socket.request.session[deviceId].userName
}! You have a current order of ${socket.request.session[
deviceId
].currentOrder.join(", ")}`
);
} else {
// If the user does not have a session, create a new session for the user's device
socket.request.session[deviceId] = {
userName: "",
currentOrder: [],
deviceId: deviceId, // store the deviceId in the session object
};
}
// Ask for the user's name if not provided already
if (!socket.request.session[deviceId].userName) {
socket.emit("bot-message", "Hello! What's your name?");
} else {
socket.emit(
"bot-message",
`Welcome back, ${
socket.request.session[deviceId].userName
}! You have a current order of ${socket.request.session[
deviceId
].currentOrder.join(", ")}`
);
}
let userName = socket.request.session[deviceId].userName;
// Listen for incoming bot messages
socket.on("bot-message", (message) => {
console.log("Bot message received:", message);
socket.emit("bot-message", message);
});
// Listen for incoming user messages
socket.on("user-message", (message) => {
console.log("User message received:", message);
if (!userName) {
// Save the user's name and update the welcome message
userName = message;
socket.request.session[deviceId].userName = userName;
socket.emit(
"bot-message",
`Welcome to the Fast Food ChatBot, ${userName}!\n1. Place an order\n99. Checkout order\n98. Order history\n97. Current order\n0. Cancel order`
);
} else {
switch (message) {
case "1":
// Generate the list of items dynamically
const itemOptions = Object.keys(fastFoods)
.map((item) => `${item}. ${fastFoods[item]}`)
.join("\n");
socket.emit(
"bot-message",
`The menu items are:\n${itemOptions}\nType the item number to add to your order`
);
break;
case "97":
// Show the user their current order
if (socket.request.session[deviceId].currentOrder.length > 0) {
const currentOrder =
socket.request.session[deviceId].currentOrder.join(", ");
socket.emit(
"bot-message",
`Your current order: ${currentOrder}\n1. Place an order\n99. Checkout order\n98. Order history\n97. Current order\n0. Cancel order`
);
} else {
socket.emit(
"bot-message",
`You don't have any items in your current order yet. Type '1' to see the menu.`
);
}
break;
case "99":
// Checkout the order
if (socket.request.session[deviceId].currentOrder.length > 0) {
const currentOrder =
socket.request.session[deviceId].currentOrder.join(", ");
orderHistory.push({
user: userName,
order: currentOrder,
date: new Date(),
});
socket.emit(
"bot-message",
`Thanks for your order, ${userName}! Your order of ${currentOrder} will be ready shortly.\n1. Place an order\n98. Order history\n0. Cancel order`
);
socket.request.session[deviceId].currentOrder = [];
} else {
socket.emit(
"bot-message",
`You don't have any items in your current order yet. Type '1' to see the menu.`
);
}
break;
case "98":
// Show the order history
if (orderHistory.length > 0) {
const history = orderHistory
.map(
(order) =>
`${order.user} ordered ${
order.order
} on ${order.date.toDateString()}`
)
.join("\n");
socket.emit(
"bot-message",
`Here is the order history:\n${history}\n1. Place an order\n98. Order history\n0. Cancel order`
);
} else {
socket.emit(
"bot-message",
`There is no order history yet. Type '1' to see the menu.`
);
}
break;
case "0":
// Cancel the order
const currentOrder = socket.request.session[deviceId].currentOrder;
if (currentOrder.length === 0 && orderHistory.length === 0) {
socket.emit(
"bot-message",
`There is nothing to cancel. Type '1' to see the menu.`
);
} else {
socket.request.session[deviceId].currentOrder = [];
orderHistory.length = 0;
socket.emit(
"bot-message",
`Your order has been cancelled.\n1. Place a new order\n98. Order history`
);
}
break;
default:
// Add the item to the current order
const itemNumber = parseInt(message);
if (!isNaN(itemNumber) && fastFoods[itemNumber]) {
socket.request.session[deviceId].currentOrder.push(
fastFoods[itemNumber]
);
socket.emit(
"bot-message",
`You have added ${fastFoods[itemNumber]} to your current order\n Add another order from the menu\n Type '97' to see your current order\n '98' to see order history\n '99' to checkout\n '0' to cancel your order`
);
} else {
socket.emit(
"bot-message",
`Invalid input. Type '1' to see the menu.`
);
}
break;
}
}
});
// Listen for disconnection event
socket.on("disconnect", () => {
delete socket.request.session[deviceId];
console.log("User disconnected:", socket.id);
});
});
server.listen(3000, () => {
console.log("listening on 3000");
});