Upload files to "Chatbox-Website"

This commit is contained in:
Nathaniel Smith 2025-02-12 18:08:17 +00:00
parent 62f678e812
commit a9c3110645
5 changed files with 277 additions and 0 deletions

73
Chatbox-Website/chat.php Normal file
View File

@ -0,0 +1,73 @@
<?php
// Function to validate and sanitize user inputs
function validateAndSanitizeInput($input) {
return htmlspecialchars(substr(trim($input), 0, 256), ENT_QUOTES, 'UTF-8');
}
// Check if the request is a POST request
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = isset($_POST['name']) ? validateAndSanitizeInput($_POST['name']) : 'Anonymous';
$message = isset($_POST['message']) ? $_POST['message'] : '';
// Your keyword filtering code
$blockedKeywords = array("php", "javascript", "script");
foreach ($blockedKeywords as $keyword) {
if (stripos($message, $keyword) !== false) {
http_response_code(400); // Bad Request
exit('Blocked keyword detected! Your message contains blocked content.');
}
}
// Sanitize the message
$sanitizedMessage = validateAndSanitizeInput($message);
if (!empty($name) && !empty($message)) {
// Use UTC time for the timestamp
date_default_timezone_set('UTC');
$newMessage = '[' . date('d-M-Y H:i:s') . '] ' . $name . ': ' . $sanitizedMessage . PHP_EOL;
// Open the chat log file for appending
$filename = 'chatlog.txt';
// Ensure the file path is safe (optional: use a specific directory)
$safePath = './' . basename($filename);
// Read the current messages and count them
$fileContent = file_get_contents($filename);
// Split file content into an array of messages
$lines = explode(PHP_EOL, $fileContent);
// If there are more than 50 messages, remove the oldest ones
if (count($lines) >= 50) {
// Trim the oldest messages, keeping only the latest 49 messages
$lines = array_slice($lines, -49);
}
// Write the new message to the file
file_put_contents($filename, implode(PHP_EOL, $lines) . PHP_EOL . $newMessage);
// Return a success response
http_response_code(200);
exit('Message saved successfully.');
} else {
// Invalid input, return an error response
http_response_code(400);
exit('Invalid input data.');
}
} else {
// Handle GET requests (fetching chat messages)
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$filename = 'chatlog.txt';
if (file_exists($filename)) {
// Read the chat log file and send its content as the response
readfile($filename);
} else {
// Return an empty response if the chat log file doesn't exist
http_response_code(200);
exit('');
}
}
}
?>

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Chatbox</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<h1>Chatbox</h1>
<p style="text-align: center;"><a href="/Tic/" target="_blank">Play Tic-Tac-Toe</a></p>
<div id="chatbox" style="height: 400px;">
<div id="chatMessages">
<!-- The chat messages will be added here -->
</div>
</div>
<div id="popup" style="display: none;"></div>
<div id="formContainer">
<form id="chatForm">
<input type="text" name="name" size="15" maxlength="15" id="name" placeholder="Nickname" autocomplete="off" required>
<input type="text" name="message" size="40" maxlength="256" id="message" placeholder="Say Something!" autofocus required>
<input type="submit" value="Send">
</form>
</div>
<footer>
<p>c. 2023</p>
<p>The source code for this site is available on <a href="https://github.com/nxs8739/chatbox01"><b><u>GitHub</u></b></a></p>
</footer>
<script src="script.js"></script>
</body>
</html>

75
Chatbox-Website/script.js Normal file
View File

@ -0,0 +1,75 @@
function displayChatMessages(messages) {
const chatMessagesElement = document.getElementById('chatMessages');
chatMessagesElement.innerHTML = messages.map((message) => `<p>${message}</p>`).join('');
scrollToBottom();
}
function fetchChatMessages() {
fetch('chat.php')
.then((response) => response.text())
.then((data) => {
const messages = data.split('\n').filter((message) => message.trim() !== '');
displayChatMessages(messages);
})
.catch((error) => {
console.error('Error fetching chat messages:', error);
});
}
// Poll for new messages every 30 seconds
setInterval(fetchChatMessages, 30000); // 30,000 milliseconds = 30 seconds
function addChatMessage(message) {
const chatMessagesElement = document.getElementById('chatMessages');
const newMessageElement = document.createElement('p');
newMessageElement.textContent = message;
chatMessagesElement.appendChild(newMessageElement);
scrollToBottom();
}
fetchChatMessages();
document.getElementById('chatForm').addEventListener('submit', async (event) => {
event.preventDefault();
const name = document.getElementById('name').value.trim();
let message = document.getElementById('message').value.trim().toLowerCase();
if (name === '' || message === '') {
// Display a pop-up message for empty fields
alert('Nickname and message are required.');
return;
}
// Check for blocked keywords
const blockedKeywords = ['js', 'javascript', 'php'];
let blocked = false;
blockedKeywords.forEach((keyword) => {
if (message.includes(keyword)) {
// Display a pop-up message for blocked keywords
alert('Blocked keyword detected. Message not sent.');
blocked = true;
}
});
if (!blocked) {
// Send the message using AJAX
try {
await fetch('chat.php', {
method: 'POST',
body: new URLSearchParams({ name: name, message: message }),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
fetchChatMessages();
} catch (error) {
console.error('Error sending chat message:', error);
}
}
// Clear the message input after submission
event.target.reset();
});
function scrollToBottom() {
const chatbox = document.getElementById('chatbox');
chatbox.scrollTop = chatbox.scrollHeight;
}

View File

@ -0,0 +1,92 @@
body {
background-color: #000;
color: #fff;
font-family: Arial, sans-serif;
}
h1 {
text-align: center;
}
footer {
text-align: center;
padding: 10px;
display: block;
}
#chatbox {
overflow: auto;
border: 1px solid #fff;
padding: 10px;
}
#chatMessages p {
margin: 5px 0;
}
#formContainer {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
/* Add margin-top and margin-bottom to create space above and below the form */
margin: 20px 0;
}
form {
width: 100%;
max-width: 600px;
display: flex;
flex-direction: column; /* Align the form elements in a column */
align-items: center;
}
/* Adjust the width of the form elements for better fit on mobile */
input[type="text"],
input[type="submit"] {
width: 100%; /* Make the form elements full width on mobile */
max-width: 400px; /* Set a maximum width to avoid excessive stretching */
padding: 10px; /* Increase the padding for better touch interaction */
margin-bottom: 10px; /* Add some margin between form elements */
box-sizing: border-box; /* Include padding and border in the total width */
background-color: #000; /* Set the background color to black */
color: #fff; /* Set the text color to white */
}
/* Set a width for the nickname input to ensure it's visible */
input[type="text"][name="name"] {
width: 100%; /* Adjust the width to your preference */
max-width: 300px; /* Set a maximum width to avoid excessive stretching */
}
/* Set the send button to black */
input[type="submit"] {
cursor: pointer;
background-color: #000; /* Set the background color to black */
color: #fff; /* Set the text color to white */
border: none; /* Remove the border */
}
#chatbox::-webkit-scrollbar {
width: 8px;
}
#chatbox::-webkit-scrollbar-thumb {
background-color: #666;
border-radius: 4px;
}
#chatbox::-webkit-scrollbar-thumb:hover {
background-color: #555;
}
/* Media query for mobile devices */
@media (max-width: 600px) {
body {
font-size: 16px; /* Adjust the font size for better readability on smaller screens */
}
#chatbox {
height: 200px; /* Adjust the height for a better chat experience on smaller screens */
}
}