Hotfix /all and styling
This commit is contained in:
3
.env
3
.env
@@ -6,6 +6,9 @@ DISCORD_TOKEN=MTQ5MTAxODYzOTc0MTI5MjY0NA.GxBqVk.dB3cWx8t8-kWLrMLGFL-g2ePkrs7l_XE
|
|||||||
# Right-click a channel and select "Copy Channel ID" (enable Developer Mode first)
|
# Right-click a channel and select "Copy Channel ID" (enable Developer Mode first)
|
||||||
DISCORD_CHANNEL_IDS=600347996080701506,720537868996444230,1480636166150816007
|
DISCORD_CHANNEL_IDS=600347996080701506,720537868996444230,1480636166150816007
|
||||||
|
|
||||||
|
# Channel name mapping (channel_id=name, comma-separated)
|
||||||
|
CHANNEL_NAMES=600347996080701506=noticias,720537868996444230=eventos,1480636166150816007=changelog
|
||||||
|
|
||||||
# Server port (optional, defaults to 3000)
|
# Server port (optional, defaults to 3000)
|
||||||
PORT=8000
|
PORT=8000
|
||||||
|
|
||||||
|
|||||||
BIN
data/messages.db
BIN
data/messages.db
Binary file not shown.
100
src/rss.js
100
src/rss.js
@@ -4,10 +4,44 @@ import { getMessagesByChannel, getAllChannels, getAllMessages } from './database
|
|||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
|
// Channel emoji badges (add more as needed)
|
||||||
|
const CHANNEL_EMOJIS = {
|
||||||
|
'noticias': '📢',
|
||||||
|
'eventos': '📅',
|
||||||
|
'changelog': '🔄',
|
||||||
|
'general': '💬',
|
||||||
|
'announcements': '📣',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Parse channel names from environment variable
|
||||||
|
function getChannelNames() {
|
||||||
|
const namesStr = process.env.CHANNEL_NAMES || '';
|
||||||
|
const names = {};
|
||||||
|
if (namesStr) {
|
||||||
|
namesStr.split(',').forEach(pair => {
|
||||||
|
const [id, name] = pair.split('=');
|
||||||
|
if (id && name) {
|
||||||
|
names[id.trim()] = name.trim();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChannelDisplayName(channelId) {
|
||||||
|
const names = getChannelNames();
|
||||||
|
return names[channelId] || channelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChannelEmoji(channelName) {
|
||||||
|
return CHANNEL_EMOJIS[channelName.toLowerCase()] || '📄';
|
||||||
|
}
|
||||||
|
|
||||||
function generateRSSFeed(messages, channelInfo, feedUrlSuffix = null) {
|
function generateRSSFeed(messages, channelInfo, feedUrlSuffix = null) {
|
||||||
|
const isCombined = channelInfo === 'All Channels';
|
||||||
const feed = new RSS({
|
const feed = new RSS({
|
||||||
title: `Discord Channel - ${channelInfo}`,
|
title: `Discord - ${channelInfo}`,
|
||||||
description: 'Messages from Discord channel',
|
description: isCombined ? 'Latest messages from all channels' : `Messages from ${channelInfo}`,
|
||||||
feed_url: `${process.env.BASE_URL || 'http://localhost:3000'}/rss/${feedUrlSuffix || channelInfo}`,
|
feed_url: `${process.env.BASE_URL || 'http://localhost:3000'}/rss/${feedUrlSuffix || channelInfo}`,
|
||||||
site_url: process.env.BASE_URL || 'http://localhost:3000',
|
site_url: process.env.BASE_URL || 'http://localhost:3000',
|
||||||
language: 'en',
|
language: 'en',
|
||||||
@@ -17,9 +51,28 @@ function generateRSSFeed(messages, channelInfo, feedUrlSuffix = null) {
|
|||||||
|
|
||||||
for (const msg of messages) {
|
for (const msg of messages) {
|
||||||
const pubDate = new Date(msg.created_at);
|
const pubDate = new Date(msg.created_at);
|
||||||
|
const channelName = getChannelDisplayName(msg.channel_id);
|
||||||
|
const emoji = getChannelEmoji(channelName);
|
||||||
|
|
||||||
|
// HTML-formatted description with visual badge
|
||||||
|
const formattedDescription = `
|
||||||
|
<div style="margin-bottom: 8px;">
|
||||||
|
<span style="display: inline-block; background: #5865F2; color: white; padding: 2px 8px; border-radius: 4px; font-size: 12px; font-weight: bold;">
|
||||||
|
${emoji} ${channelName}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div style="border-left: 3px solid #5865F2; padding-left: 12px; margin-top: 8px;">
|
||||||
|
${msg.content}
|
||||||
|
</div>
|
||||||
|
`.trim();
|
||||||
|
|
||||||
feed.item({
|
feed.item({
|
||||||
title: `Update patch from ${pubDate.toISOString()}`,
|
title: `${emoji} [${channelName}] ${pubDate.toLocaleString()}`,
|
||||||
description: msg.content,
|
description: formattedDescription,
|
||||||
|
categories: [
|
||||||
|
{ name: channelName },
|
||||||
|
{ name: msg.author_name },
|
||||||
|
],
|
||||||
url: `https://discord.com/channels/_/${msg.channel_id}/${msg.id}`,
|
url: `https://discord.com/channels/_/${msg.channel_id}/${msg.id}`,
|
||||||
guid: msg.id,
|
guid: msg.id,
|
||||||
date: pubDate,
|
date: pubDate,
|
||||||
@@ -41,25 +94,7 @@ router.get('/', (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// GET /rss/:channelId - RSS feed for specific channel
|
// GET /rss/all - Combined RSS feed from all channels
|
||||||
router.get('/:channelId', (req, res) => {
|
|
||||||
const { channelId } = req.params;
|
|
||||||
const limit = parseInt(req.query.limit, 10) || 50;
|
|
||||||
|
|
||||||
const messages = getMessagesByChannel(channelId, limit);
|
|
||||||
|
|
||||||
if (messages.length === 0) {
|
|
||||||
return res.status(404).json({
|
|
||||||
error: 'No messages found for this channel',
|
|
||||||
hint: 'Make sure the bot has fetched messages from this channel',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const xml = generateRSSFeed(messages, channelId);
|
|
||||||
res.type('application/rss+xml').send(xml);
|
|
||||||
});
|
|
||||||
|
|
||||||
// GET /rss-all - Combined RSS feed from all channels
|
|
||||||
router.get('/all', (req, res) => {
|
router.get('/all', (req, res) => {
|
||||||
const limit = parseInt(req.query.limit, 10) || 50;
|
const limit = parseInt(req.query.limit, 10) || 50;
|
||||||
|
|
||||||
@@ -76,4 +111,23 @@ router.get('/all', (req, res) => {
|
|||||||
res.type('application/rss+xml').send(xml);
|
res.type('application/rss+xml').send(xml);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// GET /rss/:channelId - RSS feed for specific channel
|
||||||
|
router.get('/:channelId', (req, res) => {
|
||||||
|
const { channelId } = req.params;
|
||||||
|
const limit = parseInt(req.query.limit, 10) || 50;
|
||||||
|
|
||||||
|
const messages = getMessagesByChannel(channelId, limit);
|
||||||
|
|
||||||
|
if (messages.length === 0) {
|
||||||
|
return res.status(404).json({
|
||||||
|
error: 'No messages found for this channel',
|
||||||
|
hint: 'Make sure the bot has fetched messages from this channel',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const displayName = getChannelDisplayName(channelId);
|
||||||
|
const xml = generateRSSFeed(messages, displayName, channelId);
|
||||||
|
res.type('application/rss+xml').send(xml);
|
||||||
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|||||||
Reference in New Issue
Block a user