mirror of
https://github.com/CHN-beta/nixos.git
synced 2026-01-12 02:09:26 +08:00
packages/missgram: save info to db
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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" ]
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
23
packages/missgram/src/db.cpp
Normal file
23
packages/missgram/src/db.cpp
Normal 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;
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# include <biu.hpp>
|
||||
# include <sqlgen.hpp>
|
||||
29
packages/missgram/src/tg.cpp
Normal file
29
packages/missgram/src/tg.cpp
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user