// 写入用户数据到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 = `
`;
} 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 = `
`;
}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 = `
`;
}
// 判断如果是管理员字体加红
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(); // 播放声音
}