From a20a1a7434edc48ad12200201a8829bd89f4bb1f Mon Sep 17 00:00:00 2001 From: Trumeet Date: Sun, 3 Apr 2022 11:32:34 -0700 Subject: Better refresh command --- refresh.c | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 138 insertions(+), 6 deletions(-) diff --git a/refresh.c b/refresh.c index 8146563..ad932f4 100644 --- a/refresh.c +++ b/refresh.c @@ -9,6 +9,11 @@ #include #include +#include +#include +#include +#include +#include struct refresh_session { bool running; @@ -16,6 +21,9 @@ struct refresh_session { long long message_id; long long offset_message_id; unsigned int progress; + unsigned int start; + unsigned int end; + unsigned int imported; }; static struct refresh_session current_session = { @@ -53,6 +61,10 @@ static void send_administrative_msg(char *text) { send_msg(current_session.chat_id, current_session.message_id, text); } +static void cb_store(bool succ) { + if (succ && current_session.running) current_session.imported++; +} + static void cb_refresh_mlink(bool successful, struct TdObject *result, struct TdError *error, void *cb_arg) { if (!successful) { char msg[512]; @@ -69,7 +81,7 @@ static void cb_refresh_mlink(bool successful, struct TdObject *result, struct Td return; } LOGDV("%lld", info->message_->id_); - store(info->message_); + store(info->message_, &cb_store); refresh_get(); } @@ -92,21 +104,32 @@ static void cb_refresh_link(bool successful, struct TdObject *result, struct TdE td_send(TdCreateObjectGetMessageLinkInfo(m->url_), &cb_refresh_mlink, NULL); } +static void refresh_prog_report(char msg[512]) { + snprintf(msg, 512, "Result report:\n" + "Progress: %u / %u. Imported %u.", + current_session.progress - current_session.start, + 1 + current_session.end - current_session.start, + current_session.imported); +} + static void refresh_get(void) { - if (current_session.progress > 815) { - send_administrative_msg("Done."); + if (!current_session.running) return; + if (current_session.progress > current_session.end) { + char m[1024] = "Done. "; + refresh_prog_report(&m[6]); + send_administrative_msg(m); current_session.running = false; return; } char url[64]; - sprintf(url, "https://t.me/ksyxsays/%u", current_session.progress ++); + sprintf(url, "https://t.me/ksyxsays/%u", current_session.progress++); LOGDV("Get %s", url); td_send(TdCreateObjectGetInternalLinkType(url), &cb_refresh_link, NULL); } -void refresh(struct TdMessage *msg) { +static void cmd_start(struct TdMessage *msg, unsigned int start, unsigned int end) { if (current_session.running) { send_msg(msg->chat_id_, msg->id_, "A refresh is already in progress."); return; @@ -115,7 +138,116 @@ void refresh(struct TdMessage *msg) { current_session.message_id = msg->id_; current_session.chat_id = msg->chat_id_; current_session.offset_message_id = 0; - current_session.progress = 1; + current_session.progress = start; + current_session.end = end; + current_session.start = start; + current_session.imported = 0; send_administrative_msg("Refreshing ..."); refresh_get(); +} + +static void cmd_status(struct TdMessage *msg) { + char m[1024]; + if (current_session.running) { + snprintf(m, 1024, "A refresh task is running. "); + refresh_prog_report(&m[27]); + } else { + snprintf(m, 1024, "Refresh is not running."); + } + send_msg(msg->chat_id_, msg->id_, m); +} + +static void cmd_stop(struct TdMessage *msg) { + if (!current_session.running) { + send_msg(msg->chat_id_, msg->id_, "Refresh is not running."); + return; + } + current_session.running = false; + char m[1024] = "Stopped. "; + refresh_prog_report(&m[9]); + send_msg(msg->chat_id_, msg->id_, m); +} + +void refresh(struct TdMessage *msg) { + assert(msg->content_->ID == CODE_MessageText); + char *token = strtok(((struct TdMessageText *) msg->content_)->text_->text_, " "); + unsigned int i = 0; + unsigned int action = 0; + unsigned int start = 0; + unsigned int end = 0; + while (token) { + LOGDV("%u %s", i, token); + switch (i++) { + case 0: { + break; + } + case 1: { /* 0: /refresh */ + if (!strcmp(token, "start")) { + action = 1; + } else if (!strcmp(token, "status")) { + action = 2; + } else if (!strcmp(token, "stop")) { + action = 3; + } else { + send_msg(msg->chat_id_, msg->id_, "Invalid command."); + return; + } + break; + } + case 2: { + if (action != 1) { + send_msg(msg->chat_id_, msg->id_, "Invalid argument."); + return; + } + goto parse_range; + parse_range: + { + char *endptr; + uintmax_t num = strtoumax(token, &endptr, 10); + if (strcmp(endptr, "") != 0 || (num == UINTMAX_MAX && errno == ERANGE) || + num > UINT_MAX || num <= 0) { + send_msg(msg->chat_id_, msg->id_, "Invalid range."); + return; + } + if (!start) start = (unsigned int) num; + else end = (unsigned int) num; + } + break; + } + case 3: { + if (action != 1) { + send_msg(msg->chat_id_, msg->id_, "Invalid argument."); + return; + } + goto parse_range; + } + default: { + send_msg(msg->chat_id_, msg->id_, "Invalid argument."); + return; + } + } + token = strtok(NULL, " "); + } + switch (action) { + case 1: { + if (!start || !end || end < start) { + send_msg(msg->chat_id_, msg->id_, "Usage: /refresh start [from] [to]"); + return; + } + cmd_start(msg, start, end); + break; + } + case 2: { + cmd_status(msg); + break; + } + case 3: { + cmd_stop(msg); + break; + } + default: { + send_msg(msg->chat_id_, msg->id_, "Invalid argument."); + break; + } + } } \ No newline at end of file -- cgit v1.2.3