From f7deb945ae5deda751ecd904452643f8a2f5cf5a Mon Sep 17 00:00:00 2001 From: Haonan Chen Date: Sat, 27 Dec 2025 22:59:45 +0800 Subject: [PATCH] packages/missgram: save info to db --- devices/vps6/secrets.yaml | 7 +++-- .../{misskey-forwarder.nix => missgram.nix} | 7 ++++- packages/missgram/CMakeLists.txt | 2 +- packages/missgram/include/missgram.hpp | 18 ++++++++++++ packages/missgram/src/db.cpp | 23 +++++++++++++++ packages/missgram/src/main.cpp | 22 +++++++------- packages/missgram/src/sql.cpp | 2 -- packages/missgram/src/tg.cpp | 29 +++++++++++++++++++ 8 files changed, 91 insertions(+), 19 deletions(-) rename modules/services/{misskey-forwarder.nix => missgram.nix} (88%) create mode 100644 packages/missgram/src/db.cpp delete mode 100644 packages/missgram/src/sql.cpp create mode 100644 packages/missgram/src/tg.cpp diff --git a/devices/vps6/secrets.yaml b/devices/vps6/secrets.yaml index 4f07e9ed..d1f0a5e5 100644 --- a/devices/vps6/secrets.yaml +++ b/devices/vps6/secrets.yaml @@ -5,10 +5,11 @@ coturn: tinc: ENC[AES256_GCM,data:E3OrPA67R48x5FJUW0ZbERlclz8Z/XokAaGTeBQLPEHSeqEArHYSZkdJRZejFrBruJPlGZMPNBQzlIBXOfXKwMnlBDaGJIIJHIzPDGG9W7QF4IIRK/BjVZHFwfKvZtbUDGsqLcCSe5+ttmyucBaFGquXhnD/Tu09uyWtRvS10KAJLY0Z2/16CFB1+8egJIcYw2TFXObo+KR92Va0qwiDSepKaJtYLimDGRKk04QGj+BYa5y8PjIG6bz8UG82mmCiV7XM3EPlSMA=,iv:kawsklNGFbRhxKuUwvNL2WyBxuYu2T/uks1cJ4i8NhA=,tag:V+jAaxQX7JCiR5+wIVW4Nw==,type:str] postgresql: headscale: ENC[AES256_GCM,data:z2cyyT1TcIhNJCBeGn072aFI2nAioWZQvpyzoky4tWtMymKlw4ilOtSYAsp+kaNOoqvWSmoAQNJLNzeDk1iTCQ==,iv:hZdS/CAVBO0k/AmX3qw3YwTYgK49Aeu5QI3YCAduiZ0=,tag:2l4GPV/T2GHjAAUDX3LaEA==,type:str] + missgram: ENC[AES256_GCM,data:zUY6397ThfeHDD8/Msy3mWnTjXCkEhpgsUwcjXnhIiNET1J14hIojCbwUpdCtGTFF+RQOtaS9aGSp8ctQeWIwg==,iv:0+WeCoMFQFhnzjSfvz0ZnqK6FIn1QBHr9fB+tjBNSDk=,tag:Bf5krX2hxIPlkdiAXppSqA==,type:str] missgram: secret: ENC[AES256_GCM,data:qsxJue8mGAJejSxOoPd4MXD06upnk0fxUM5EKPBs/WI=,iv:HaHj/vJkIERUQ0Lr93s9kaApNWPjDcpLu2897qmCjqA=,tag:u73jUDd6pGKk1yir/oF4hQ==,type:str] telegramBotToken: ENC[AES256_GCM,data:kNGhj1SjyK1H8NJmJLi90cpGtWmmGpFEFFT/JkDX4QqxbOC6BfFIMgzVsZ5GVQ==,iv:sccRmCs8HBAvi9mDAaz8OjxqXLAVXepJHaj7RrUt6kI=,tag:RuK3EdRMVhS9pVDw50lW6A==,type:str] - telegramChatId: ENC[AES256_GCM,data:Wy5PWg2nJgeL3zMquEk=,iv:FU9wl2eJzCH88lMLqRW6WX66h43Iw/jrdWsPwFbi7+Y=,tag:8OON6H1R6NWa+RqA/KxIrA==,type:str] + telegramChatId: ENC[AES256_GCM,data:7QZ/a34deTPox/4XYas=,iv:HqjrKM4trnF/F4f3IpCzw/G8cy9S9mLUALAOGFCnBnI=,tag:yAFPhihKa9hfMUMywzg0mg==,type:int] sops: age: - recipient: age19ax6vm3pv8rph5tq3mmehd9sy9jk823tw8svsd790r0lkslycquqvlwz9m @@ -29,7 +30,7 @@ sops: ZXFTU3ZCaW1pTVh0RUJzdDdGdHlPYTgK2mlgcX2kEc8+2UDdBnhUm6IIuh8V6agW ooxH9OEPXUVI/4JcDo4v8ZUhAyU1ehLH0Ef7PJCChOZe2KZmWSNbhA== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-12-27T03:38:11Z" - mac: ENC[AES256_GCM,data:/IM0SIc9BaGaVl3k5173R6Zz/Z87hexrAL4y0TGMNyvMy2ZrG2XJvr01XW+YbE9TPQxNZQDW9e6Xfn2jKoz+EUPEjSVEr2XC12ZUhwnEu9x99lmwvUrf8CwuXAfUIUN4hJvv7e5PsjaVkR1VAs/t6d5gYlqgX45oi8WMX6JQl/U=,iv:e8nzV4S/8F/5jcYlPwHyBBffutULS3kYOaIApv9MTBA=,tag:gt3g2pBPgfKv80kGYSb87A==,type:str] + lastmodified: "2025-12-28T02:43:11Z" + mac: ENC[AES256_GCM,data:n+Mbl+DUVu7galTCsJzdNMeR3hjnJpYQhXgmkGdWpXiakGZTY9xpfsfNIc38JJFaSYywf+ZAYsnTQqUPXUm6OFACLIim/Iw6q0n8ZRn3bcEa0PCBXMeO9UGnqnQI+gxYKgRSJai1kt18mnKi5oXuNOlnUCgm8smddALITtEvRDg=,iv:cz3nFpmTqOW6zrggY9RVa9gc2J7S1lRQt+lv7lSFat4=,tag:7Kl+msp0XFenRZCup2Y73A==,type:str] unencrypted_suffix: _unencrypted version: 3.11.0 diff --git a/modules/services/misskey-forwarder.nix b/modules/services/missgram.nix similarity index 88% rename from modules/services/misskey-forwarder.nix rename to modules/services/missgram.nix index 985bbb4f..e4c1c447 100644 --- a/modules/services/misskey-forwarder.nix +++ b/modules/services/missgram.nix @@ -29,7 +29,11 @@ inputs: }; nixos = { - services.nginx.https."missgram.chn.moe".location."/".proxy.upstream = "http://127.0.0.1:9173"; + services = + { + nginx.https."missgram.chn.moe".location."/".proxy.upstream = "http://127.0.0.1:9173"; + postgresql.instances.missgram = {}; + }; system.sops = { templates."missgram/config.yml" = @@ -43,6 +47,7 @@ inputs: TelegramBotToken = placeholder."missgram/telegramBotToken"; TelegramChatId = placeholder."missgram/telegramChatId"; ServerPort = 9173; + dbPassword = placeholder."postgresql/missgram"; }; }; secrets = inputs.lib.genAttrs' [ "secret" "telegramBotToken" "telegramChatId" ] diff --git a/packages/missgram/CMakeLists.txt b/packages/missgram/CMakeLists.txt index 0e617f6e..3dbd0cc7 100644 --- a/packages/missgram/CMakeLists.txt +++ b/packages/missgram/CMakeLists.txt @@ -13,7 +13,7 @@ find_package(biu REQUIRED) find_package(httplib REQUIRED) find_package(sqlgen REQUIRED) -add_executable(missgram src/main.cpp src/sql.cpp) +add_executable(missgram src/main.cpp src/db.cpp src/tg.cpp) target_include_directories(missgram PRIVATE $) target_link_libraries(missgram PRIVATE biu::biu httplib::httplib sqlgen::sqlgen) target_compile_features(missgram PRIVATE cxx_std_23) diff --git a/packages/missgram/include/missgram.hpp b/packages/missgram/include/missgram.hpp index e69de29b..32472284 100644 --- a/packages/missgram/include/missgram.hpp +++ b/packages/missgram/include/missgram.hpp @@ -0,0 +1,18 @@ +# include + +namespace missgram +{ + void db_write(std::string misskey_note, int telegram_message_id); + std::optional db_read(std::string misskey_note); + + std::optional tg_send(std::string text, std::optional replyId = {}); + + struct Config + { + std::string Secret; + std::string TelegramBotToken; + int TelegramChatId; + int ServerPort; + std::string dbPassword; + } inline config; +} diff --git a/packages/missgram/src/db.cpp b/packages/missgram/src/db.cpp new file mode 100644 index 00000000..ed4c9277 --- /dev/null +++ b/packages/missgram/src/db.cpp @@ -0,0 +1,23 @@ +# include +# include + +struct Record { std::string misskey_note; int telegram_message_id; }; + +void missgram::db_write(std::string misskey_note, int telegram_message_id) +{ + auto&& conn = sqlgen::postgres::connect + ({.user = "missgram", .password = config.dbPassword, .host = "127.0.0.1", .dbname = "missgram"}); + sqlgen::write(conn, Record{misskey_note, telegram_message_id}); +} + +std::optional missgram::db_read(std::string misskey_note) +{ + using namespace sqlgen::literals; + auto&& conn = sqlgen::postgres::connect + ({.user = "missgram", .password = config.dbPassword, .host = "127.0.0.1", .dbname = "missgram"}); + auto query = sqlgen::read> | + sqlgen::where("misskey_note"_c == misskey_note) | + sqlgen::limit(1); + auto result = query(conn); + if (!result || result->empty()) return {}; else return result->front().telegram_message_id; +} diff --git a/packages/missgram/src/main.cpp b/packages/missgram/src/main.cpp index 2d4aeb93..5aa2ce19 100644 --- a/packages/missgram/src/main.cpp +++ b/packages/missgram/src/main.cpp @@ -1,6 +1,6 @@ -# include +# include # include -# include + # ifndef MISSGRAM_CONFIG_FILE # define MISSGRAM_CONFIG_FILE "./config.yaml" # endif @@ -8,15 +8,10 @@ int main() { using namespace biu::literals; + using namespace missgram; biu::Logger::Guard log; - struct Config - { - std::string Secret; - std::string TelegramBotToken; - std::string TelegramChatId; - int ServerPort; - } config = YAML::LoadFile(MISSGRAM_CONFIG_FILE).as(); + config = YAML::LoadFile(MISSGRAM_CONFIG_FILE).as(); biu::Logger::try_exec([&] { @@ -36,7 +31,7 @@ int main() { struct Note { - std::string text, visibility; + std::string id, text, visibility; std::optional replyId; struct Renote { std::string id; }; std::optional renote; @@ -57,8 +52,11 @@ int main() if (content.body.note->renote) text += "\n🔁 Renote: {}/notes/{}"_f(content.server, content.body.note->renote->id); - TgBot::Bot bot(config.TelegramBotToken); - // bot.getApi().sendMessage(config.TelegramChatId, text); + std::thread([text, note_id = content.body.note->id] + { + auto message_id = tg_send(text); + if (message_id) db_write(note_id, *message_id); + }).detach(); res.status = 200; res.body = "OK"; diff --git a/packages/missgram/src/sql.cpp b/packages/missgram/src/sql.cpp deleted file mode 100644 index decc21d2..00000000 --- a/packages/missgram/src/sql.cpp +++ /dev/null @@ -1,2 +0,0 @@ -# include -# include diff --git a/packages/missgram/src/tg.cpp b/packages/missgram/src/tg.cpp new file mode 100644 index 00000000..c39d2fa9 --- /dev/null +++ b/packages/missgram/src/tg.cpp @@ -0,0 +1,29 @@ +# include +# include + +std::optional missgram::tg_send(std::string text, std::optional replyId) +{ + using namespace biu::literals; + + // 准备信息 + TgBot::Bot bot(config.TelegramBotToken); + std::shared_ptr reply; + if (replyId) reply = std::make_shared(*replyId); + + // 发送信息,带重试机制 + TgBot::Message::Ptr message; + auto retry_delay = 1s; + int attempts = 0; + while (attempts < 5 && !message) + { + biu::Logger::try_exec([&] + { + message = bot.getApi().sendMessage + (config.TelegramChatId, text, nullptr, reply); + }); + if (!message) { std::this_thread::sleep_for(retry_delay); retry_delay *= 2; attempts++; } + } + + // 返回消息 ID + if (message) return message->messageId; +}