From 45516d648321adc0d8ef567fcb767cd412d10109 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Sat, 25 Oct 2025 15:03:55 +0800 Subject: update --- ircbot/main.py | 43 +++++++-------- irclog/view/index.html | 59 ++++++++++++++++++++ irclog/view/view.js | 143 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 222 insertions(+), 23 deletions(-) create mode 100644 irclog/view/index.html create mode 100644 irclog/view/view.js diff --git a/ircbot/main.py b/ircbot/main.py index 28745c4..3c8c40b 100644 --- a/ircbot/main.py +++ b/ircbot/main.py @@ -12,9 +12,11 @@ PORT = 6667 NICKNAME = "android" IDENT = NICKNAME REALNAME = "bot" -CHANNELS = ["#main", "#ezl9fd7fa13c4bad4f4"] +CHANNELS = [ +] GREETINGS = ["#main"] LOGPATH = '/volume/webroot/irclog' +RELAYBOT = 'TeleIRC' BUFFER_SIZE = 2048 @@ -34,30 +36,12 @@ def help_cmd(chan, sender, args): 2. 丢骰子: !dice [骰数]d[面数] 3. 随机选择:!choice 选项1 选项2 ... 选项n 4. 复读机:!say 复读内容 - 5. AI词典:!dict 单词 + 5. AI词典: !dict 单词 6. 查看聊天记录:!log """ -def today_log(chan): - now = datetime.datetime.now() - year = now.strftime("%Y") - month = now.strftime("%m") - day = now.strftime("%d") - url = (f"https://raye.mistivia.com/irclog/view.html#{chan}/" - f"{year}/{month}-{day}") - return url - -def yesterday_log(chan): - now = datetime.datetime.now() - datetime.timedelta(days=1) - year = now.strftime("%Y") - month = now.strftime("%m") - day = now.strftime("%d") - url = (f"https://raye.mistivia.com/irclog/view.html#{chan}/" - f"{year}/{month}-{day}") - return url - @command("log") def log_command(chan, sender, args): - return today_log(chan) + return f"https://raye.mistivia.com/irclog/view/?chan={chan[1:]}" @command("join") def join_command(chan, sender, args): @@ -337,12 +321,25 @@ class IRCBot: cmd_parts = message[1:].split() cmd = cmd_parts[0].lower() args = cmd_parts[1:] - reply_target = target if target.startswith('#') else sender_nick - self.handle_command(sender_nick, reply_target, cmd, args) except IndexError: pass + elif sender_nick == RELAYBOT: + end_of_nick_index = message.find('>') + nick = message[1:end_of_nick_index] + msg_start_index = end_of_nick_index + 2 + msg = message[msg_start_index:].strip() + if msg.startswith("!") or msg.startswith("!"): + try: + cmd_parts = msg[1:].split() + cmd = cmd_parts[0].lower() + args = cmd_parts[1:] + if target.startswith('#'): + reply_target = target + self.handle_command(nick, reply_target, cmd, args) + except IndexError: + pass elif command == "JOIN": args = params diff --git a/irclog/view/index.html b/irclog/view/index.html new file mode 100644 index 0000000..ca76d66 --- /dev/null +++ b/irclog/view/index.html @@ -0,0 +1,59 @@ + + + + + + IRC Log Viewer + + + + +

IRC Log Viewer

+
+ + + +
+
+
+ + +
+ + + + + diff --git a/irclog/view/view.js b/irclog/view/view.js new file mode 100644 index 0000000..eb98af0 --- /dev/null +++ b/irclog/view/view.js @@ -0,0 +1,143 @@ +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'); + +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)); + window.history.replaceState(null, '', window.location.origin + window.location.pathname + + '?chan=' + chan + + '&y=' + year + + '&m=' + month + + '&d=' + day); +} + +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 logProcess(text) { + text = ircAction(text); + text = escapeHtml(text); + text = linkify(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)}
`; + }) + .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')); +} \ No newline at end of file -- cgit v1.0