const logContainer = document.getElementById('log-container'); const dateInput = document.getElementById('log-date'); const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); let chan = urlParams.get('chan'); let year = urlParams.get('y'); let month = urlParams.get('m'); let day = urlParams.get('d'); let hashtag = window.location.hash.substring(1); if (chan === 'main') { document.getElementById('searchlink').style.visibility = 'visible'; } function getDate(year, month, day) { try { year = parseInt(year, 10); month = parseInt(month, 10); day = parseInt(day, 10); if (isNaN(year) || isNaN(month) || isNaN(day)) { throw new Error("date is NaN"); } return new Date(year, month - 1, day); } catch (e) { console.log(e); const now = new Date(); const y = now.toLocaleString('en-US', { timeZone: 'Asia/Shanghai', year: 'numeric' }); const m = now.toLocaleString('en-US', { timeZone: 'Asia/Shanghai', month: 'numeric' }); const d = now.toLocaleString('en-US', { timeZone: 'Asia/Shanghai', day: 'numeric' }); return getDate(y, m, d); } } function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } function setDateState(date) { year = date.getFullYear(); month = String(date.getMonth() + 1).padStart(2, '0'); day = String(date.getDate()).padStart(2, '0'); dateInput.value = formatDate(getDate(year, month, day)); let newurl = window.location.origin + window.location.pathname + '?chan=' + chan + '&y=' + year + '&m=' + month + '&d=' + day; if (hashtag !== '') { newurl = newurl + '#' + hashtag; } window.history.replaceState(null, '', newurl); } setDateState(getDate(year, month, day)); logContainer.innerHTML = ''; function escapeHtml(unsafe) { if (!unsafe) return ''; return unsafe .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function ircAction(text) { const regex = /^(\[[^\]]+\])(\s*<)([^>]+)(>:\s*)(\u0001ACTION\s+)([^\u0001]+)(\u0001)(.*)$/gm; const replacement = '$1 * $3 $6$8'; return text.replace(regex, replacement); } function linkify(text) { const urlRegex = /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; return text.replace(urlRegex, function(url) { return `${url}`; }); } function sethash(time) { let newurl = window.location.pathname + window.location.search + '#' + time; window.history.replaceState(null, '', newurl); } function insertTag(text) { let res = ''; let lines = text.split('\n'); let scrollToInserted = false; for (let line of lines) { let time = line.substring(1, 9); if (time == hashtag && time !== '') { if (!scrollToInserted) { res += ''; scrollToInserted = true; } res += '' + line + '\n'; } else { res += '' + line + '\n'; } } hashtag = ''; return res; } function logProcess(text) { text = ircAction(text); text = escapeHtml(text); text = linkify(text); text = insertTag(text); return text; } function loadLog() { let targetUrl = 'https://raye.mistivia.com/irclog/%23' + chan + '/' + year + '/' + month + '-' + day + '.txt'; fetch(targetUrl) .then(response => { if (!response.ok) { throw new Error(`HTTP Error: ${response.status} ${response.statusText} for hash: ${urlHash}`); } return response.text(); }) .then(text => { logContainer.innerHTML = `
${logProcess(text)}`;
let scrollTo = document.getElementById('scrollTo');
if (scrollTo) {
scrollTo.scrollIntoView({behavior: 'smooth', block: 'center'});
}
})
.catch(error => {
console.error('Fetch error:', error);
logContainer.innerHTML = '';
});
}
loadLog();
function onDateChange() {
var dateInput = this;
var dateValue = dateInput.value;
if (dateValue && chan) {
var dateParts = dateValue.split('-');
var year = dateParts[0];
var month = dateParts[1];
var day = dateParts[2];
let date = getDate(year, month, day);
setDateState(date);
loadLog();
}
}
document.getElementById("log-date").addEventListener('change', onDateChange, false);
function changeDate(days) {
let currentDate = getDate(year, month, day);
const currentDay = currentDate.getDate();
currentDate.setDate(currentDay + days);
setDateState(currentDate);
dateInput.dispatchEvent(new Event('change'));
}
function setPreviousDay() {
changeDate(-1);
window.scrollTo(0, 0);
}
function setNextDay() {
changeDate(1);
window.scrollTo(0, 0);
}
function setToday() {
let date = getDate('', '', '');
setDateState(date);
dateInput.dispatchEvent(new Event('change'));
}
function gotosearch() {
window.open('../search/', '_blank');
}