summaryrefslogtreecommitdiff
path: root/refresh.c
diff options
context:
space:
mode:
Diffstat (limited to 'refresh.c')
-rw-r--r--refresh.c121
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