mirror of
https://github.com/WCBROW01/zblock.git
synced 2025-12-12 04:28:07 -05:00
Send all new entries in a feed, not just the first
This commit is contained in:
2
Makefile
2
Makefile
@ -1,4 +1,4 @@
|
|||||||
CFLAGS = -Wall -Wextra -O2
|
CFLAGS = -Wall -Wextra -std=gnu99 -O2
|
||||||
LDFLAGS = -lpthread -lcurl -lmrss
|
LDFLAGS = -lpthread -lcurl -lmrss
|
||||||
|
|
||||||
SRC = $(wildcard *.c)
|
SRC = $(wildcard *.c)
|
||||||
|
|||||||
@ -8,7 +8,7 @@ A simple, lightweight Discord RSS bot
|
|||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
[ ] Add build instructions
|
[ ] Add build instructions
|
||||||
[ ] Get all new feeds, not just the first one
|
[x] Get all new feeds, not just the first one
|
||||||
[ ] Set permissions for add and remove command
|
[ ] Set permissions for add and remove command
|
||||||
[ ] Import feeds from disk on startup
|
[ ] Import feeds from disk on startup
|
||||||
[ ] Remove all feeds if bot is removed from a guild
|
[ ] Remove all feeds if bot is removed from a guild
|
||||||
|
|||||||
45
main.c
45
main.c
@ -1,4 +1,8 @@
|
|||||||
|
#define _GNU_SOURCE
|
||||||
|
#define _XOPEN_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -38,7 +42,7 @@ struct bot_command {
|
|||||||
struct feed_info {
|
struct feed_info {
|
||||||
char *title;
|
char *title;
|
||||||
char *url;
|
char *url;
|
||||||
char *pubDate;
|
char *last_pubDate;
|
||||||
u64snowflake guild_id;
|
u64snowflake guild_id;
|
||||||
u64snowflake channel_id;
|
u64snowflake channel_id;
|
||||||
unsigned timer_id;
|
unsigned timer_id;
|
||||||
@ -48,12 +52,24 @@ struct feed_info {
|
|||||||
void feed_info_free(struct feed_info *feed) {
|
void feed_info_free(struct feed_info *feed) {
|
||||||
free(feed->title);
|
free(feed->title);
|
||||||
free(feed->url);
|
free(feed->url);
|
||||||
free(feed->pubDate);
|
free(feed->last_pubDate);
|
||||||
free(feed);
|
free(feed);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *database_path = "feeds";
|
static const char *database_path = "feeds";
|
||||||
|
|
||||||
|
// format string for for the time format of pubDate
|
||||||
|
#define PUBDATE_FMT "%a, %d %b %Y %T %z"
|
||||||
|
|
||||||
|
// maybe change the function signature so you can actually do error handling with the result?
|
||||||
|
static time_t pubDate_to_time_t(char *s) {
|
||||||
|
struct tm tm;
|
||||||
|
char *res = strptime(s, PUBDATE_FMT, &tm);
|
||||||
|
if (!res || !*res) return 0; // invalid time
|
||||||
|
|
||||||
|
return mktime(&tm);
|
||||||
|
}
|
||||||
|
|
||||||
// default interval for the feed retrieval timer
|
// default interval for the feed retrieval timer
|
||||||
#define TIMER_INTERVAL 600
|
#define TIMER_INTERVAL 600
|
||||||
|
|
||||||
@ -61,16 +77,27 @@ static const char *database_path = "feeds";
|
|||||||
static void timer_retrieve_feeds(struct discord *client, struct discord_timer *timer) {
|
static void timer_retrieve_feeds(struct discord *client, struct discord_timer *timer) {
|
||||||
struct feed_info *feed = timer->data;
|
struct feed_info *feed = timer->data;
|
||||||
|
|
||||||
struct mrss_t *mrss_feed;
|
mrss_t *mrss_feed;
|
||||||
if (mrss_parse_url(feed->url, &mrss_feed)) return; // do nothing on error
|
if (mrss_parse_url(feed->url, &mrss_feed)) return; // do nothing on error
|
||||||
|
|
||||||
// get publication date and check if it is the same (change this later this is lazy and won't get all new feeds)
|
// get publication date of entries send any new ones
|
||||||
if (strcmp(mrss_feed->item->pubDate, feed->pubDate)) {
|
time_t last_pubDate_time = pubDate_to_time_t(feed->last_pubDate);
|
||||||
|
mrss_item_t *item = mrss_feed->item;
|
||||||
|
bool update_pubDate = false;
|
||||||
|
while (item && pubDate_to_time_t(item->pubDate) > last_pubDate_time) {
|
||||||
|
update_pubDate = true;
|
||||||
|
|
||||||
// Send new entry in the feed
|
// Send new entry in the feed
|
||||||
char msg[DISCORD_MAX_MESSAGE_LEN];
|
char msg[DISCORD_MAX_MESSAGE_LEN];
|
||||||
snprintf(msg, sizeof(msg), "## %s\n### %s\n%s", mrss_feed->title, mrss_feed->item->title, mrss_feed->item->link);
|
snprintf(msg, sizeof(msg), "## %s\n### %s\n%s", mrss_feed->title, mrss_feed->item->title, mrss_feed->item->link);
|
||||||
struct discord_create_message res = { .content = msg };
|
struct discord_create_message res = { .content = msg };
|
||||||
discord_create_message(client, feed->channel_id, &res, NULL);
|
discord_create_message(client, feed->channel_id, &res, NULL);
|
||||||
|
item = item->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (update_pubDate) {
|
||||||
|
free(feed->last_pubDate);
|
||||||
|
feed->last_pubDate = strdup(mrss_feed->item->pubDate);
|
||||||
}
|
}
|
||||||
|
|
||||||
mrss_free(mrss_feed);
|
mrss_free(mrss_feed);
|
||||||
@ -99,13 +126,13 @@ static void bot_command_add(struct discord *client, const struct discord_interac
|
|||||||
}
|
}
|
||||||
|
|
||||||
feed->title = mrss_feed->title;
|
feed->title = mrss_feed->title;
|
||||||
feed->pubDate = mrss_feed->item->pubDate;
|
feed->last_pubDate = mrss_feed->item->pubDate;
|
||||||
feed->feed_id = rand();
|
feed->feed_id = rand();
|
||||||
|
|
||||||
|
|
||||||
char file_path[PATH_MAX];
|
char file_path[PATH_MAX];
|
||||||
// check if we ran out of path
|
// maybe check if we ran out of characters for path?
|
||||||
int path_len = snprintf(file_path, sizeof(file_path), "%s/%lu/%lu/%x", database_path, event->guild_id, event->channel_id, feed->feed_id);
|
snprintf(file_path, sizeof(file_path), "%s/%lu/%lu/%x", database_path, event->guild_id, event->channel_id, feed->feed_id);
|
||||||
|
|
||||||
FILE *fp = fopen(file_path, "w");
|
FILE *fp = fopen(file_path, "w");
|
||||||
if (!fp) {
|
if (!fp) {
|
||||||
@ -114,7 +141,7 @@ static void bot_command_add(struct discord *client, const struct discord_interac
|
|||||||
feed_info_free(feed);
|
feed_info_free(feed);
|
||||||
goto send_msg;
|
goto send_msg;
|
||||||
}
|
}
|
||||||
fprintf(fp, "title=%s\nurl=%s\npubDate=%s\n", feed->title, feed->url, feed->pubDate);
|
fprintf(fp, "title=%s\nurl=%s\nlast_pubDate=%s\n", feed->title, feed->url, feed->last_pubDate);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
// spawn the timer for this feed
|
// spawn the timer for this feed
|
||||||
|
|||||||
Reference in New Issue
Block a user