diff options
Diffstat (limited to 'refresh.c')
-rw-r--r-- | refresh.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/refresh.c b/refresh.c new file mode 100644 index 0000000..8146563 --- /dev/null +++ b/refresh.c @@ -0,0 +1,121 @@ +/* + * Created by yuuta on 4/1/22. + */ + +#include "log.h" +#include "logic.h" +#include "botd.h" +#include "tdutils.h" + +#include <stdio.h> +#include <stdbool.h> + +struct refresh_session { + bool running; + long long chat_id; + long long message_id; + long long offset_message_id; + unsigned int progress; +}; + +static struct refresh_session current_session = { + false, + 0, + 0, + 0 +}; + +static void refresh_get(void); + +static void send_msg(long long chat_id, long long message_id, char *text) { + td_send(TdCreateObjectSendMessage(chat_id, + 0, + message_id, + TdCreateObjectMessageSendOptions(false, + false, + true, + NULL), + NULL, + (struct TdInputMessageContent *) + TdCreateObjectInputMessageText( + TdCreateObjectFormattedText(text, + (struct TdVectorTextEntity *) + TdCreateObjectVectorObject( + 0, NULL) + ), + false, + false)), + NULL, + NULL); +} + +static void send_administrative_msg(char *text) { + send_msg(current_session.chat_id, current_session.message_id, text); +} + +static void cb_refresh_mlink(bool successful, struct TdObject *result, struct TdError *error, void *cb_arg) { + if (!successful) { + char msg[512]; + snprintf(msg, 512, "Cannot get message link info: %d (%s)", + error ? error->code_ : -1, + error ? error->message_ : "NULL"); + send_administrative_msg(msg); + current_session.running = false; + return; + } + struct TdMessageLinkInfo *info = (struct TdMessageLinkInfo *) result; + if (!info->message_) { + refresh_get(); + return; + } + LOGDV("%lld", info->message_->id_); + store(info->message_); + refresh_get(); +} + +static void cb_refresh_link(bool successful, struct TdObject *result, struct TdError *error, void *cb_arg) { + if (!successful) { + char msg[512]; + snprintf(msg, 512, "Cannot get link: %d (%s)", + error ? error->code_ : -1, + error ? error->message_ : "NULL"); + send_administrative_msg(msg); + current_session.running = false; + return; + } + struct TdInternalLinkType *type = (struct TdInternalLinkType *) result; + if (type->ID != CODE_InternalLinkTypeMessage) { + refresh_get(); + return; + } + struct TdInternalLinkTypeMessage *m = (struct TdInternalLinkTypeMessage *) type; + td_send(TdCreateObjectGetMessageLinkInfo(m->url_), &cb_refresh_mlink, NULL); +} + +static void refresh_get(void) { + if (current_session.progress > 815) { + send_administrative_msg("Done."); + current_session.running = false; + return; + } + char url[64]; + 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) { + if (current_session.running) { + send_msg(msg->chat_id_, msg->id_, "A refresh is already in progress."); + return; + } + current_session.running = true; + current_session.message_id = msg->id_; + current_session.chat_id = msg->chat_id_; + current_session.offset_message_id = 0; + current_session.progress = 1; + send_administrative_msg("Refreshing ..."); + refresh_get(); +}
\ No newline at end of file |