From af7b3761a568790bdefd2e783a8cd2d66caf0000 Mon Sep 17 00:00:00 2001 From: Trumeet Date: Sun, 3 Apr 2022 10:50:38 -0700 Subject: Add store result callback --- logic.h | 2 +- main.c | 6 ++++-- store.c | 28 ++++++++++++++++++++++------ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/logic.h b/logic.h index d85a631..3246e8f 100644 --- a/logic.h +++ b/logic.h @@ -8,7 +8,7 @@ #include "td/td/telegram/td_c_client.h" #include "tdutils.h" -void store(struct TdMessage *msg); +void store(struct TdMessage *msg, void (*cb)(bool)); void refresh(struct TdMessage *msg); diff --git a/main.c b/main.c index 806c8ef..841c21d 100644 --- a/main.c +++ b/main.c @@ -35,16 +35,18 @@ int main(int argc, char **argv) { return 0; } +static void cb_store(bool succ) {} + int handle_message(struct TdUpdateNewMessage *update) { struct TdMessage *msg = update->message_; if (msg->sender_id_->ID == CODE_MessageSenderUser && ((struct TdMessageSenderUser *) msg->sender_id_)->user_id_ == ADMIN) { if (msg->content_->ID == CODE_MessageText && - !strcmp(((struct TdMessageText *) msg->content_)->text_->text_, "/refresh")) { + !strncmp(((struct TdMessageText *) msg->content_)->text_->text_, "/refresh", 8)) { refresh(msg); return 0; } } - store(msg); + store(msg, &cb_store); return 0; } \ No newline at end of file diff --git a/store.c b/store.c index f49f23b..379d2e2 100644 --- a/store.c +++ b/store.c @@ -11,12 +11,14 @@ #include #include #include +#include /* Temp object between message callback and link callback */ struct say { long long msg_id; long long chat_id; char *text; + void (*cb)(bool); }; static void cb_link(bool successful, struct TdObject *result, struct TdError *error, void *cb_arg) { @@ -26,7 +28,7 @@ static void cb_link(bool successful, struct TdObject *result, struct TdError *er s->chat_id, s->msg_id, error ? error->message_ : "NULL", error ? error->code_ : 0); - goto cleanup; + goto f; } LOGDV("%s", s->text); struct TdMessageLink *link = (struct TdMessageLink *) result; @@ -40,7 +42,7 @@ static void cb_link(bool successful, struct TdObject *result, struct TdError *er goto sql_err; sql_err: LOGEV("Cannot insert: %s.", sqlite3_errstr(r)); - goto cleanup; + goto f; } if ((r = sqlite3_bind_text(stmt, 1, s->text, (int) strlen(s->text), NULL))) { goto sql_err; @@ -55,7 +57,15 @@ static void cb_link(bool successful, struct TdObject *result, struct TdError *er sqlite3_finalize(stmt); if (r != SQLITE_DONE && r != SQLITE_CONSTRAINT) { goto sql_err; + } else if (r == SQLITE_CONSTRAINT) { + goto f; + } else { + s->cb(true); + goto cleanup; } + assert(false); + f: + s->cb(false); goto cleanup; cleanup: free(s->text); @@ -95,23 +105,29 @@ static bool filter(struct TdMessage *msg) { return true; } -void store(struct TdMessage *msg) { - if (!filter(msg)) return; +void store(struct TdMessage *msg, void (*cb)(bool)) { + if (!filter(msg)) { + goto f; + f: + cb(false); + return; + } struct TdMessageText *text = (struct TdMessageText *) msg->content_; const char *t = text->text_->text_; struct say *s; if (!(s = malloc(sizeof(struct say)))) { LOGEV("Cannot allocate memory: %s.", strerror(errno)); - return; + goto f; } memset(s, 0, sizeof(struct say)); s->chat_id = msg->chat_id_; s->msg_id = msg->id_; + s->cb = cb; /* I'm just too lazy to manually free in each callback, so just strdup. */ if (!(s->text = strdup(t))) { LOGEV("Cannot allocate memory: %s.", strerror(errno)); free(s); - return; + goto f; } td_send(TdCreateObjectGetMessageLink(msg->chat_id_, msg->id_, -- cgit v1.2.3