// 写入用户数据到cookes //var cookesstr = document.cookie.indexOf('userdata') !== -1; // 保存用户特征信息到cookie document.cookie = 'userdata=13.59.75.217'; var lastMessageCount = 0; // 用于记录消息总数 //消息容器盒子 var chatBox = document.getElementById("chat-box"); function fetchMessages() { let fetchobject = fetch("fetch_messages.php") .then(response => response.json()) .then(data => { const currentScrollTop = chatBox.scrollTop; // 获取当前滚动位置 const chatBoxHeight = chatBox.clientHeight; // 聊天框高度 const scrollHeight = chatBox.scrollHeight; // 内容高度 // 更新消息数量 const newMessageCount = data.length; let isuser = 1; //chatBox.innerHTML = ""; if (data.length > lastMessageCount) { // 仅追加新消息 const newMessages = data.slice(lastMessageCount); const fragment = document.createDocumentFragment(); newMessages.forEach(msg => { const msgDiv = document.createElement("div"); msgDiv.className = "chat-message"; let content; let mime = msg.type; let fileneme = msg.name; if (mime === 'text') { content = msg.content; } else if (mime.search(/image\/*/i) != -1) { content = ` ${msg.fileName} `; } else if(mime.search(/video\/*/i) != -1){ // 将文件大小转换为 Mb 并保留两位小数 const fileSizeInKB = (msg.size / 1024 /1024).toFixed(2); //判断文件名称是否过长 if(fileneme.length > 10 && window.innerWidth < 500){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 10); fileneme = fileneme + "..." + result; }else if(fileneme.length > 25){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 25); fileneme = fileneme + "..." + result; } content = `
`; }else if(mime.search(/audio\/*/i) != -1){ // 将文件大小转换为 Mb 并保留两位小数 const fileSizeInKB = (msg.size / 1024 /1024).toFixed(2); //判断文件名称是否过长 if(fileneme.length > 10 && window.innerWidth < 500){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 10); fileneme = fileneme + "..." + result; }else if(fileneme.length > 25){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 25); fileneme = fileneme + "..." + result; } content = `
${fileneme} ${fileSizeInKB} MB
`; }else{ // 将文件大小转换为 Mb 并保留两位小数 const fileSizeInKB = (msg.size / 1024 /1024).toFixed(2); //判断文件名称是否过长 if(fileneme.length > 10 && window.innerWidth < 500){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 10); fileneme = fileneme + "..." + result; }else if(fileneme.length > 25){ var result = fileneme.split("."); n = result.length - 1; result = result[n]; fileneme = fileneme.slice(0, 25); fileneme = fileneme + "..." + result; } content = `
${fileneme} ${fileSizeInKB} MB
`; } // 判断如果是管理员字体加红 let str = msg.ip; if(str.includes("管理员")){ let newStr = str.replace("管理员", ""); str = newStr + "管理员"; } var infostyle = "if-info-you"; // 消息提示音,判断是否为本人发送,本人发送不播放消息声音 var cookiedata = ""; cookiedata = document.cookie.split('; ').reduce((prev, curr) => { const [key, value]= curr.split('=') prev[key] = value return prev },{}) //判断是否同ip let variable = cookiedata.userdata; let regex = new RegExp(`.*${variable}.*`); // 使用模板字符串插入变量 isuser = !regex.test(str); if(!isuser){ infostyle = "if-info-i" ; } //管理员IP不显示 if(str.includes("管理员")){ var strarr = str.split(" "); strarr.splice(strarr.length - 3, 1); str = strarr.join(" "); } msgDiv.innerHTML = `
${str}
${content}
${msg.timestamp}
`; fragment.appendChild(msgDiv); }); chatBox.appendChild(fragment); // 更新消息计数 //lastMessageCount = data.length; // 滚动到最新消息 //chatBox.scrollTop = chatBox.scrollHeight; } chatBox.scrollTop = chatBox.scrollHeight; // 恢复滚动位置,确保用户的输入和上传不会被打断 chatBox.scrollTop = currentScrollTop + (chatBox.scrollHeight - scrollHeight); // 消息提示音,仅当有新消息时播放提示音 if (newMessageCount > lastMessageCount && lastMessageCount != 0) { if (isuser) { playMessageSound(); // 播放声音 } } // 更新上次消息数量 lastMessageCount = newMessageCount; }); fetchobject.catch(error => console.error('Error fetching messages:', error)); } // 发送文字消息 function sendMessage() { const message = document.getElementById("message-input").value; document.getElementById("message-input").value = ''; if(message != ""){ // 获取当前页面的 GET 参数,判断是否为管理员 const urlParams = new URLSearchParams(window.location.search); var admin = urlParams.get('admin'); if(!admin){ admin = ""; } fetch("send_message.php", { method: "POST", headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: `message=${encodeURIComponent(message + "@" + admin)}` }).then(() => { // document.getElementById("message-input").value = ''; fetchMessages(); }); }else{ alert("请输入聊天内容"); } } // 定期刷新聊天内容 setInterval(fetchMessages, 3000); window.onload = fetchMessages; // 清空聊天记录 function clearChat() { if (confirm("确定要清空聊天记录和文件吗?")) { fetch('clear_chat.php', { method: 'POST', }) .then(response => response.json()) .then(data => { if (data.status === 'success') { chatBox.innerHTML = ''; // 清空聊天框 alert("聊天记录和文件已清空!"); } else { alert("清空聊天记录时出错,请重试。"); } }) .catch(error => { console.error('Error clearing chat:', error); }); } } // 上传文件和进度条 let currentXHR = null; // 用于存储当前的 XMLHttpRequest 实例 function uploadFile() { const fileInput = document.getElementById('uploadFile'); const file = fileInput.files[0]; if (!file) { alert("请选择一个文件!"); return; } // 获取当前页面的 GET 参数,判断是否为管理员 const urlParams = new URLSearchParams(window.location.search); var admin = urlParams.get('admin'); if(!admin){ admin = ""; } const formData = new FormData(); formData.append('file', file); formData.append('admin', admin); const progressContainer = document.getElementById('progress-container'); const progressBar = document.getElementById('progress-bar'); progressContainer.style.display = 'block'; // 显示进度条 document.getElementById('cancel-upload').style.display = 'inline-block'; // 显示取消按钮 currentXHR = new XMLHttpRequest(); // 创建新的 XMLHttpRequest 实例 currentXHR.open('POST', 'upload_file.php', true); // 更新进度条 currentXHR.upload.addEventListener('progress', function (e) { if (e.lengthComputable) { const percentComplete = (e.loaded / e.total) * 100; progressBar.style.width = percentComplete + '%'; } }); // 处理上传完成后的响应 currentXHR.onload = function () { if (currentXHR.status === 200) { const response = JSON.parse(currentXHR.responseText); if (response.status === 'File uploaded') { fetchMessages(); // 上传成功后刷新消息 fileInput.value = ''; // 清空文件输入 } else { alert('上传失败,请重试!'); } } else { alert('上传失败,请重试!'); } document.getElementById('progress-container').style.display = 'none'; // 隐藏进度条 document.getElementById('cancel-upload').style.display = 'none'; // 隐藏取消按钮 }; currentXHR.send(formData); } // 取消上传 function cancelUpload() { if (currentXHR) { currentXHR.abort(); // 中断当前的 XMLHttpRequest alert("上传已取消!"); document.getElementById('progress-container').style.display = 'none'; // 隐藏进度条 document.getElementById('cancel-upload').style.display = 'none'; // 隐藏取消按钮 } } // 监听输入框的 keypress 事件,如果按下的是回车键,则触发发送消息的函数。 const messageInput = document.getElementById("message-input"); messageInput.addEventListener("keypress", function (event) { if (event.key === "Enter") { event.preventDefault(); // 防止换行 sendMessage(); // 调用发送消息的函数 } }); // 长按复制消息功能 function copyToClipboard(text) { navigator.clipboard.writeText(text) .then(() => { const notification = document.getElementById("copy-notification"); notification.style.display = "block"; notification.style.opacity = 1; // 自动隐藏提示 setTimeout(() => { notification.style.opacity = 0; setTimeout(() => { notification.style.display = "none"; }, 500); // 隐藏动画时间 }, 2000); // 显示时间 }) .catch(err => { console.error("复制失败:", err); }); } // 下载文件函数 function downloadFile(fileUrl) { const a = document.createElement('a'); a.href = fileUrl; a.download = ''; // 这将提示浏览器下载文件 document.body.appendChild(a); a.click(); document.body.removeChild(a); } // 消息提示音音效 function playMessageSound() { const sound = document.getElementById("message-sound"); sound.currentTime = 0; // 从头播放 sound.play(); // 播放声音 }