Initial commit
This commit is contained in:
		
							
								
								
									
										219
									
								
								server/src/main/kotlin/Main.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								server/src/main/kotlin/Main.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,219 @@ | ||||
| package xyz.maxwellj.chookpen | ||||
|  | ||||
| import com.sun.net.httpserver.HttpExchange | ||||
| import com.sun.net.httpserver.HttpHandler | ||||
| import com.sun.net.httpserver.HttpServer | ||||
| import java.net.InetSocketAddress | ||||
|  | ||||
| import java.io.File | ||||
| import java.io.BufferedReader | ||||
|  | ||||
| fun main(args: Array<String>) { | ||||
|     // Crete a server and start listening for arguments | ||||
|     val server = HttpServer.create(InetSocketAddress(8000), 0) | ||||
|     server.createContext("/test", ServerTester()) | ||||
|     server.createContext("/api", ApiHandler()) | ||||
|     server.createContext("/api/createAccount", CreateAccount()) | ||||
|     server.executor = null | ||||
|     server.start() | ||||
|     println("Server has started on port 8000") | ||||
| } | ||||
|  | ||||
| class ServerTester : HttpHandler { | ||||
|     override fun handle(t: HttpExchange) { | ||||
|         val response = "Testing, testing, 1, 2, 3... Somehow this is going to make it to production one day" | ||||
|         t.sendResponseHeaders(200, response.length.toLong()) | ||||
|         val os = t.responseBody | ||||
|         os.write(response.toByteArray()) | ||||
| 	println("Test request recieved!") | ||||
|         os.close() | ||||
|     } | ||||
| } | ||||
|  | ||||
| class ApiHandler : HttpHandler { | ||||
|     override fun handle(t: HttpExchange) { | ||||
|         println("Request recieved...") | ||||
|         // Get the data | ||||
|         val path = t.requestURI.path | ||||
|         val inputData = path.substringAfter("/api/") | ||||
|         println("API request recieved: $inputData") | ||||
|         | ||||
|         // Parse data sent to the server by client | ||||
|         var username = "" | ||||
|         var token = "" | ||||
|         var message = "" | ||||
|         var dataType = "" | ||||
|         var isParsingData = 0 | ||||
|         for (char in inputData) { | ||||
|             val character = char | ||||
|             if (character == ':') { | ||||
|                 isParsingData = 1 | ||||
|             } else if (isParsingData == 1) { | ||||
|                 if (character == '}') { | ||||
|                     isParsingData = 0 | ||||
|                     dataType = "" | ||||
|                 } else if (character != '{') { | ||||
|                     if (dataType == "username") { | ||||
|                         username += character | ||||
|                     } else if (dataType == "token") { | ||||
|                         token += character | ||||
|                     } else if (dataType == "message") { | ||||
|                         message += character | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 dataType += character | ||||
|             } | ||||
|         } | ||||
|         val userDatabaseParser = BufferedReader(File("userDatabase").reader()) | ||||
|         var lineNumber = 1 | ||||
|         var userLine = "" | ||||
|      | ||||
|         // Search the user database to find required information about the user | ||||
|         userDatabaseParser.forEachLine { line -> | ||||
|             if (line.contains(username)) { | ||||
|                 userLine = line | ||||
|             } | ||||
|             lineNumber++ | ||||
|         } | ||||
|         userDatabaseParser.close() | ||||
|  | ||||
|         if (userLine == "") { | ||||
|             val response = "That account does not exist on this server." | ||||
|             t.sendResponseHeaders(403, response.length.toLong()) | ||||
|             val os = t.responseBody | ||||
|             os.write(response.toByteArray()) | ||||
|             os.close() | ||||
|             return | ||||
|         } | ||||
|   | ||||
|         var usernameInDatabase = "" | ||||
|         var tokenInDatabase = "" | ||||
|         var currentStage = 0 | ||||
|         for (char in userLine) { | ||||
|             if (char == ':') { | ||||
|                 currentStage ++ | ||||
|             } | ||||
|             if (currentStage == 0) { | ||||
|                 usernameInDatabase += char | ||||
|             } else if (currentStage == 1) { | ||||
|                 tokenInDatabase += char | ||||
|             } | ||||
|         } | ||||
|         tokenInDatabase = tokenInDatabase.replace(":", "") | ||||
|         if (token != tokenInDatabase)  { | ||||
|             val response = "Invalid token! Please try putting in your password right" | ||||
|             t.sendResponseHeaders(403, response.length.toLong()) | ||||
|             val os = t.responseBody | ||||
|             os.write(response.toByteArray()) | ||||
|             os.close() | ||||
|             return | ||||
|         } | ||||
|         // Make the message to respond to the client | ||||
|         val chatHistoryView = File("chatHistory") | ||||
|         var fullMessage = "" | ||||
|         if (message != "") { | ||||
|             fullMessage = "${chatHistoryView.readText()}$username: $message" | ||||
|             // Add the client's message to the chat history | ||||
|             val chatHistory = File("chatHistory") | ||||
|             chatHistory.appendText("$username: $message ${System.lineSeparator()}") | ||||
|             message = "" | ||||
|         } else { | ||||
|             fullMessage = "${chatHistoryView.readText()}" | ||||
|         } | ||||
|         val response = if (inputData.isNotEmpty()) { | ||||
|             fullMessage             | ||||
|         } else { | ||||
|             "No data provided" | ||||
|         } | ||||
|  | ||||
|         // Send the message to the client | ||||
|         t.sendResponseHeaders(200, response.length.toLong()) | ||||
|         val os = t.responseBody | ||||
|         os.write(response.toByteArray()) | ||||
|         println("API request handled: $inputData") | ||||
|         os.close() | ||||
|  | ||||
|     } | ||||
| } | ||||
| class CreateAccount : HttpHandler { | ||||
|     override fun handle(t: HttpExchange) { | ||||
|         val path = t.requestURI.path | ||||
|         val inputData = path.substringAfter("/api/createAccount/") | ||||
|         println("Account creation request recieved: $inputData") | ||||
|         | ||||
|         // Parse data sent to the server by client | ||||
|         var username = "" | ||||
|         var token = "" | ||||
|         var message = "" | ||||
|         var dataType = "" | ||||
|         var isParsingData = 0 | ||||
|         for (char in inputData) { | ||||
|             val character = char | ||||
|             if (character == ':') { | ||||
|                 isParsingData = 1 | ||||
|             } else if (isParsingData == 1) { | ||||
|                 if (character == '}') { | ||||
|                     isParsingData = 0 | ||||
|                     dataType = "" | ||||
|                 } else if (character != '{') { | ||||
|                     if (dataType == "username") { | ||||
|                         username += character | ||||
|                     } else if (dataType == "token") { | ||||
|                         token += character | ||||
|                     } else if (dataType == "message") { | ||||
|                         message += character | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 dataType += character | ||||
|             } | ||||
|         } | ||||
|         val userDatabaseParser = BufferedReader(File("userDatabase").reader()) | ||||
|         var lineNumber = 1 | ||||
|         var userExists = 0 | ||||
|      | ||||
|         // Search the user database to find required information about the user | ||||
|         userDatabaseParser.forEachLine { line -> | ||||
|             if (line.contains(username)) { | ||||
|                 val response = "That username already exists on the server! Please choose a different username" | ||||
|                 t.sendResponseHeaders(422, response.length.toLong()) | ||||
|                 val os = t.responseBody | ||||
|                 os.write(response.toByteArray()) | ||||
|                 os.close() | ||||
|                 userExists = 1 | ||||
|             } | ||||
|             lineNumber++ | ||||
|         } | ||||
|         userDatabaseParser.close() | ||||
|         if (userExists == 1) {return} | ||||
|         println("$username:$token") | ||||
|  | ||||
|         if (username == "") { | ||||
|             val response = "Please input a username" | ||||
|             t.sendResponseHeaders(422, response.length.toLong()) | ||||
|             val os = t.responseBody | ||||
|             os.write(response.toByteArray()) | ||||
|             os.close() | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         if (token == "") { | ||||
|             val response = "Please input a password" | ||||
|             t.sendResponseHeaders(422, response.length.toLong()) | ||||
|             val os = t.responseBody | ||||
|             os.write(response.toByteArray()) | ||||
|             os.close() | ||||
|             return | ||||
|         } | ||||
|  | ||||
|         val userDatabaseFile = File("userDatabase") | ||||
|         userDatabaseFile.appendText("${System.lineSeparator()}$username:$token") | ||||
|         val response = "Creating account was successful!" | ||||
|         t.sendResponseHeaders(200, response.length.toLong()) | ||||
|         val os = t.responseBody | ||||
|         os.write(response.toByteArray()) | ||||
| 	    println("") | ||||
|         os.close() | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Maxwell Jeffress
					Maxwell Jeffress