summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2022-04-05 13:06:55 -0700
committerTrumeet <yuuta@yuuta.moe>2022-04-05 13:06:55 -0700
commit1ad9927e8eb242a828effff2d3bec2aae9314667 (patch)
treefef5cb702b038d78e226bbb4eaa8be651a91a455
parenta20a1a7434edc48ad12200201a8829bd89f4bb1f (diff)
downloadksyxbot-1ad9927e8eb242a828effff2d3bec2aae9314667.tar
ksyxbot-1ad9927e8eb242a828effff2d3bec2aae9314667.tar.gz
ksyxbot-1ad9927e8eb242a828effff2d3bec2aae9314667.tar.bz2
ksyxbot-1ad9927e8eb242a828effff2d3bec2aae9314667.zip
Support global statistics.
-rw-r--r--CMakeLists.txt2
-rw-r--r--logic.h2
-rw-r--r--main.c5
-rw-r--r--stat.c46
4 files changed, 54 insertions, 1 deletions
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