packages/missgram: save info to db

This commit is contained in:
2025-12-27 22:59:45 +08:00
parent c3e1d2bfb7
commit f7deb945ae
8 changed files with 91 additions and 19 deletions

View File

@@ -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

View File

@@ -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" ]

View File

@@ -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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)
target_link_libraries(missgram PRIVATE biu::biu httplib::httplib sqlgen::sqlgen)
target_compile_features(missgram PRIVATE cxx_std_23)

View File

@@ -0,0 +1,18 @@
# include <biu.hpp>
namespace missgram
{
void db_write(std::string misskey_note, int telegram_message_id);
std::optional<int> db_read(std::string misskey_note);
std::optional<int> tg_send(std::string text, std::optional<int> replyId = {});
struct Config
{
std::string Secret;
std::string TelegramBotToken;
int TelegramChatId;
int ServerPort;
std::string dbPassword;
} inline config;
}

View File

@@ -0,0 +1,23 @@
# include <missgram.hpp>
# include <sqlgen/postgres.hpp>
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<int> 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<std::vector<Record>> |
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;
}

View File

@@ -1,6 +1,6 @@
# include <biu.hpp>
# include <missgram.hpp>
# include <httplib.h>
# include <tgbot/tgbot.h>
# 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>();
config = YAML::LoadFile(MISSGRAM_CONFIG_FILE).as<Config>();
biu::Logger::try_exec([&]
{
@@ -36,7 +31,7 @@ int main()
{
struct Note
{
std::string text, visibility;
std::string id, text, visibility;
std::optional<std::string> replyId;
struct Renote { std::string id; };
std::optional<Renote> 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";

View File

@@ -1,2 +0,0 @@
# include <biu.hpp>
# include <sqlgen.hpp>

View File

@@ -0,0 +1,29 @@
# include <missgram.hpp>
# include <tgbot/tgbot.h>
std::optional<int> missgram::tg_send(std::string text, std::optional<int> replyId)
{
using namespace biu::literals;
// 准备信息
TgBot::Bot bot(config.TelegramBotToken);
std::shared_ptr<TgBot::ReplyParameters> reply;
if (replyId) reply = std::make_shared<TgBot::ReplyParameters>(*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;
}