/* * Created by yuuta on 4/1/22. */ #include "log.h" #include "logic.h" #include "botd.h" #include "tdutils.h" #include #include 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(); }