From 13c2d0d51b724e546eca6735aa3b468dcb7ed45a Mon Sep 17 00:00:00 2001 From: Steve Grisafi Date: Sun, 13 Dec 2020 14:57:53 -0500 Subject: [PATCH] Added functionality to allow students to submit text messages to the TA. This does not include the ability to respond back, nor does it map usernames to text. It maps messages to socket instead. Specific changes to code include: -Added printChats method to OfficeHoursServer -Added ChatListener to OfficeHoursServer -Added new event listener to OfficeHoursServer to handle chats -Added additional html to provide a new text field and submission button. -Added enterChatText javascript function to read and process html inputs. --- nginx/public/index.html | 3 + nginx/public/officeHours.js | 6 ++ src/main/scala/model/OfficeHoursServer.scala | 64 ++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/nginx/public/index.html b/nginx/public/index.html index 5443216..effcd48 100644 --- a/nginx/public/index.html +++ b/nginx/public/index.html @@ -15,6 +15,9 @@

Welcome!



+ + +

diff --git a/nginx/public/officeHours.js b/nginx/public/officeHours.js index 3514c14..50e9cdc 100644 --- a/nginx/public/officeHours.js +++ b/nginx/public/officeHours.js @@ -23,6 +23,12 @@ function enterQueue() { document.getElementById("name").value = ""; } +function enterChatText() { + let newChatMessage1 = document.getElementById("chat").value; + socket.emit("chat_input", newChatMessage1); + document.getElementById("chat").value = ""; +} + function readyToHelp() { socket.emit("ready_for_student"); } diff --git a/src/main/scala/model/OfficeHoursServer.scala b/src/main/scala/model/OfficeHoursServer.scala index 09ef61b..eeb4d7d 100644 --- a/src/main/scala/model/OfficeHoursServer.scala +++ b/src/main/scala/model/OfficeHoursServer.scala @@ -8,6 +8,8 @@ import play.api.libs.json.{JsValue, Json} class OfficeHoursServer() { + var chatLog: Map[SocketIOClient, List[String]] = Map() + val database: DatabaseAPI = if(Configuration.DEV_MODE){ new TestingDatabase }else{ @@ -27,6 +29,7 @@ class OfficeHoursServer() { server.addDisconnectListener(new DisconnectionListener(this)) server.addEventListener("enter_queue", classOf[String], new EnterQueueListener(this)) server.addEventListener("ready_for_student", classOf[Nothing], new ReadyForStudentListener(this)) + server.addEventListener("chat_input", classOf[String], new ChatListener(this)) server.start() @@ -36,6 +39,29 @@ class OfficeHoursServer() { Json.stringify(Json.toJson(queueJSON)) } + def printChats(): Unit = { + if (this.chatLog.keys.isEmpty) { + println("Empty chat log") + } else { + for (user <- this.chatLog.keys) { + if (this.chatLog(user).isEmpty) { + println(" ") + println("Socket: " + user) + println("_______________") + println(" ") + } else { + println(" ") + println("Socket: " + user) + println("_______________") + for (chatLine <- this.chatLog(user)) { + println(chatLine) + } + println(" ") + } + } + } + } + } object OfficeHoursServer { @@ -83,4 +109,42 @@ class ReadyForStudentListener(server: OfficeHoursServer) extends DataListener[No } } +class ChatListener(server: OfficeHoursServer) extends DataListener[String] { + override def onData(socket: SocketIOClient, chatMessage: String, ackRequest: AckRequest): Unit = { + if (server.chatLog.contains(socket)) { + val prevChats: List[String] = server.chatLog(socket) + val currentChats: List[String] = chatMessage :: prevChats + server.chatLog = server.chatLog + (socket -> currentChats) + } else { + server.chatLog = server.chatLog + (socket -> List(chatMessage)) + } + + + + + if (server.chatLog.keys.isEmpty) { + println("Empty chat log") + } else { + for (user <- server.chatLog.keys) { + if (server.chatLog(user).isEmpty) { + println(" ") + println("Socket: " + user) + println("_______________") + println(" ") + } else { + println(" ") + println("Socket: " + user) + println("_______________") + for (chatLine <- server.chatLog(user)) { + println(chatLine) + } + println(" ") + } + } + } + + + } +} +