From 1ad9927e8eb242a828effff2d3bec2aae9314667 Mon Sep 17 00:00:00 2001 From: Trumeet Date: Tue, 5 Apr 2022 13:06:55 -0700 Subject: Support global statistics. --- CMakeLists.txt | 2 +- logic.h | 2 ++ main.c | 5 +++++ stat.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 stat.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7251ace..deede86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,6 +15,6 @@ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -fsanitize=address") add_definitions(-D_POSIX_C_SOURCE=200809L) -add_executable(ksyxbotd main.c tdutils.c tdutils.h log.c log.h botd.h db.c db.h cmdline.c store.c logic.h query.c refresh.c) +add_executable(ksyxbotd main.c tdutils.c tdutils.h log.c log.h botd.h db.c db.h cmdline.c store.c logic.h query.c refresh.c stat.c) target_include_directories(ksyxbotd PUBLIC "${PROJECT_BINARY_DIR}") target_link_libraries(ksyxbotd PRIVATE tdc tdsqlite m) diff --git a/logic.h b/logic.h index 3246e8f..47216c5 100644 --- a/logic.h +++ b/logic.h @@ -12,4 +12,6 @@ void store(struct TdMessage *msg, void (*cb)(bool)); void refresh(struct TdMessage *msg); +void stat(struct TdMessage *msg); + #endif /* KSYXBOT_LOGIC_H */ diff --git a/main.c b/main.c index 841c21d..c9a9a33 100644 --- a/main.c +++ b/main.c @@ -39,6 +39,11 @@ static void cb_store(bool succ) {} int handle_message(struct TdUpdateNewMessage *update) { struct TdMessage *msg = update->message_; + if (msg->content_->ID == CODE_MessageText && + !strncmp(((struct TdMessageText *) msg->content_)->text_->text_, "/stat", 5)) { + stat(msg); + return 0; + } if (msg->sender_id_->ID == CODE_MessageSenderUser && ((struct TdMessageSenderUser *) msg->sender_id_)->user_id_ == ADMIN) { if (msg->content_->ID == CODE_MessageText && diff --git a/stat.c b/stat.c new file mode 100644 index 0000000..387bab6 --- /dev/null +++ b/stat.c @@ -0,0 +1,46 @@ +/* + * Created by yuuta on 4/5/22. + */ + +#include "logic.h" +#include "log.h" +#include "tdutils.h" +#include "db.h" + +void stat(struct TdMessage *msg) { + int r; + char m[2048]; + sqlite3_stmt *stmt = NULL; + if ((r = sqlite3_prepare_v2(db, "SELECT COUNT(user), SUM(i) FROM stats;", -1, &stmt, NULL))) { + goto sql_err; + sql_err: + { + snprintf(m, 1024, "Cannot query statistics: %s.", sqlite3_errstr(r)); + LOGEV("%s", m); + if (stmt) sqlite3_finalize(stmt); + goto send; + } + } + if ((r = sqlite3_step(stmt)) != SQLITE_ROW) goto sql_err; + snprintf(m, 1024, "普天之下,莫非 K 土。TGCN 共有 %d 位 K 教授的虔诚学生卖了 %d 句菜。", + sqlite3_column_int(stmt, 0), + sqlite3_column_int(stmt, 1)); + sqlite3_finalize(stmt); + goto send; + send: + td_send(TdCreateObjectSendMessage(msg->chat_id_, + 0, + msg->id_, + TdCreateObjectMessageSendOptions(false, false, true, NULL), + NULL, + (struct TdInputMessageContent *) + TdCreateObjectInputMessageText( + TdCreateObjectFormattedText(m, + (struct TdVectorTextEntity *) + TdCreateObjectVectorObject( + 0, NULL) + ), + false, + false)), + NULL, NULL); +} \ No newline at end of file -- cgit v1.2.3