summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2022-04-03 10:50:38 -0700
committerTrumeet <yuuta@yuuta.moe>2022-04-03 10:50:38 -0700
commitaf7b3761a568790bdefd2e783a8cd2d66caf0000 (patch)
tree8cd89c127a683c3192418fcf9f29f54e308ce548
parent625d5332f24af878c4b730b4f7c874bca8e225d7 (diff)
downloadksyxbot-af7b3761a568790bdefd2e783a8cd2d66caf0000.tar
ksyxbot-af7b3761a568790bdefd2e783a8cd2d66caf0000.tar.gz
ksyxbot-af7b3761a568790bdefd2e783a8cd2d66caf0000.tar.bz2
ksyxbot-af7b3761a568790bdefd2e783a8cd2d66caf0000.zip
Add store result callback
-rw-r--r--logic.h2
-rw-r--r--main.c6
-rw-r--r--store.c28
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 <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <assert.h>
/* 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_,