summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-10-25 15:03:55 +0800
committerMistivia <i@mistivia.com>2025-10-25 22:05:45 +0800
commit45516d648321adc0d8ef567fcb767cd412d10109 (patch)
tree51112538d1eb1c9d97b765b486bc74f313f120d8
parent2b2ce259241433ca0a3a98a6ea4a37113aed525d (diff)
update
-rw-r--r--ircbot/main.py43
-rw-r--r--irclog/view/index.html59
-rw-r--r--irclog/view/view.js143
3 files changed, 222 insertions, 23 deletions
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 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
+ <title>IRC Log Viewer</title>
+ <style>
+ body {
+ font-family: Arial, sans-serif;
+ max-width: 1000px;
+ margin: 20px;
+ background-color: #f4f4f4;
+ }
+ #log-container {
+ border: 1px solid #ccc;
+ padding: 15px;
+ background-color: #fff;
+ white-space: pre-wrap;
+ }
+ pre {
+ font-family: Consolas, monospace;
+ margin: 0;
+ padding: 0;
+ overflow-wrap: anywhere;
+ white-space: pre-wrap;
+ }
+ .error {
+ color: red;
+ font-weight: bold;
+ }
+ .loading {
+ color: blue;
+ }
+
+ @media (max-width: 600px) {
+ pre {
+ font-size: 0.7em;
+ }
+ }
+ </style>
+</head>
+<body>
+
+ <h1>IRC Log Viewer</h1>
+ <div id="controls">
+ <label for="log-date">选择日期:</label>
+ <input type="date" id="log-date" value="">
+ <button onclick="setToday()">今天</button>
+ <br>
+ <br>
+ </div>
+ <button onclick="setPreviousDay()">上一天</button>
+ <button onclick="setNextDay()">下一天</button>
+ <div id="log-container"></div>
+ <button onclick="setPreviousDay()">上一天</button>
+ <button onclick="setNextDay()">下一天</button>
+ <script src="./view.js"></script>
+</body>
+</html>
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, "&amp;")
+ .replace(/</g, "&lt;")
+ .replace(/>/g, "&gt;")
+ .replace(/"/g, "&quot;")
+ .replace(/'/g, "&#039;");
+}
+
+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 `<a href="${url}" target="_blank">${url}</a>`;
+ });
+}
+
+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 = `<pre>${logProcess(text)}</pre>`;
+ })
+ .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