5 Commits

Author SHA1 Message Date
Sense T
c80c2a08a3 fix character bug 2024-01-16 09:24:13 +08:00
Sense T
6cbb55ed89 import shadow-rs for git version building into binary 2024-01-15 08:15:12 +08:00
Sense T
3bc14ce343 bug fix for bot channel etc. 2024-01-13 17:15:54 +08:00
Sense T
e02bca8ad2 fix bug 2024-01-13 13:26:53 +08:00
Sense T
fe13b65016 k8s deploy method 2024-01-13 12:59:31 +08:00
11 changed files with 242 additions and 42 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
target target
.direnv .direnv
*.db *.db
deploy/**/config

139
Cargo.lock generated
View File

@@ -502,6 +502,7 @@ version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
dependencies = [ dependencies = [
"jobserver",
"libc", "libc",
] ]
@@ -587,6 +588,32 @@ version = "0.9.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
[[package]]
name = "const_fn"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935"
[[package]]
name = "const_format"
version = "0.2.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673"
dependencies = [
"const_format_proc_macros",
]
[[package]]
name = "const_format_proc_macros"
version = "0.2.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]] [[package]]
name = "convert_case" name = "convert_case"
version = "0.4.0" version = "0.4.0"
@@ -1040,6 +1067,19 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
[[package]]
name = "git2"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbf97ba92db08df386e10c8ede66a2a0369bd277090afd8710e19e38de9ec0cd"
dependencies = [
"bitflags 2.4.1",
"libc",
"libgit2-sys",
"log",
"url",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.1" version = "0.3.1"
@@ -1088,6 +1128,7 @@ dependencies = [
"rand", "rand",
"reqwest", "reqwest",
"sea-orm", "sea-orm",
"shadow-rs",
"strfmt", "strfmt",
"teloxide", "teloxide",
"tokio", "tokio",
@@ -1346,6 +1387,12 @@ version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "is_debug"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89"
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.9.0" version = "0.9.0"
@@ -1370,6 +1417,15 @@ version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "jobserver"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.65" version = "0.3.65"
@@ -1403,6 +1459,18 @@ version = "0.2.149"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
[[package]]
name = "libgit2-sys"
version = "0.16.1+1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c"
dependencies = [
"cc",
"libc",
"libz-sys",
"pkg-config",
]
[[package]] [[package]]
name = "libm" name = "libm"
version = "0.2.8" version = "0.2.8"
@@ -1420,6 +1488,18 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "libz-sys"
version = "1.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "295c17e837573c8c821dbaeb3cceb3d745ad082f7572191409e69cbc1b3fd050"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.3.8" version = "0.3.8"
@@ -1648,6 +1728,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "num_threads"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "object" name = "object"
version = "0.32.1" version = "0.32.1"
@@ -2559,6 +2648,19 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "shadow-rs"
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "878cb1e3162d98ee1016b832efbb683ad6302b462a2894c54f488dc0bd96f11c"
dependencies = [
"const_format",
"git2",
"is_debug",
"time",
"tzdb",
]
[[package]] [[package]]
name = "sharded-slab" name = "sharded-slab"
version = "0.1.7" version = "0.1.7"
@@ -3105,6 +3207,8 @@ checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
dependencies = [ dependencies = [
"deranged", "deranged",
"itoa", "itoa",
"libc",
"num_threads",
"powerfmt", "powerfmt",
"serde", "serde",
"time-core", "time-core",
@@ -3280,6 +3384,35 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "tz-rs"
version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33851b15c848fad2cf4b105c6bb66eb9512b6f6c44a4b13f57c53c73c707e2b4"
dependencies = [
"const_fn",
]
[[package]]
name = "tzdb"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b580f6b365fa89f5767cdb619a55d534d04a4e14c2d7e5b9a31e94598687fb1"
dependencies = [
"iana-time-zone",
"tz-rs",
"tzdb_data",
]
[[package]]
name = "tzdb_data"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "629555d2921f3f0dc0de98699415a8b2b61dfcd3a0b082a327f7ed748bbb2b76"
dependencies = [
"tz-rs",
]
[[package]] [[package]]
name = "unicase" name = "unicase"
version = "2.7.0" version = "2.7.0"
@@ -3316,6 +3449,12 @@ version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]] [[package]]
name = "unicode_categories" name = "unicode_categories"
version = "0.1.1" version = "0.1.1"

View File

@@ -4,10 +4,14 @@ version = "0.1.0"
edition = "2021" edition = "2021"
description = "A boring bot for hanging your boss up." description = "A boring bot for hanging your boss up."
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
build = "build.rs"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
shadow-rs = "^0.26.0"
[dependencies] [dependencies]
shadow-rs = "^0.26.0"
wd_log = "0.2.0" wd_log = "0.2.0"
futures = "0.3.29" futures = "0.3.29"
strfmt = "^0.2.4" strfmt = "^0.2.4"

3
build.rs Normal file
View File

@@ -0,0 +1,3 @@
fn main() -> shadow_rs::SdResult<()> {
shadow_rs::new()
}

View File

@@ -0,0 +1,27 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: hangitbot
spec:
selector:
matchLabels:
app: hangitbot
template:
metadata:
labels:
app: hangitbot
spec:
containers:
- name: hangitbot
image: <Image>
resources:
limits:
memory: "64Mi"
cpu: "100m"
envFrom:
- secretRef:
name: hangitbot
env:
- name: API_URL
value: https://tgapi.sense-t.eu.org/

View File

@@ -0,0 +1,13 @@
# yaml-language-server: $schema=https://json.schemastore.org/kustomization.json
resources:
- deployment.yaml
secretGenerator:
- name: hangitbot
files:
- config/DATABASE_URI
- config/TGBOT_TOKEN
images:
- name: <Image>
newName: ghcr.io/senseab/hangitbot
newTag: v0.0.3

View File

@@ -8,7 +8,7 @@ use teloxide::{
prelude::Bot, prelude::Bot,
requests::Requester, requests::Requester,
types::{Message, ParseMode}, types::{Message, ParseMode},
utils::command::BotCommands, utils::{command::BotCommands, markdown::escape},
RequestError, RequestError,
}; };
@@ -18,7 +18,7 @@ use crate::{
messages::{ messages::{
BOT_ABOUT, BOT_TEXT_HANGED, BOT_TEXT_HANGED_SELF, BOT_TEXT_IS_CHANNEL, BOT_TEXT_NO_TARGET, BOT_ABOUT, BOT_TEXT_HANGED, BOT_TEXT_HANGED_SELF, BOT_TEXT_IS_CHANNEL, BOT_TEXT_NO_TARGET,
BOT_TEXT_TOP_GLOBAL, BOT_TEXT_TOP_GROUP, BOT_TEXT_TOP_NONE, BOT_TEXT_TOP_TEMPLATE, BOT_TEXT_TOP_GLOBAL, BOT_TEXT_TOP_GROUP, BOT_TEXT_TOP_NONE, BOT_TEXT_TOP_TEMPLATE,
BOT_TEXT_TOP_TITLE, BOT_TEXT_TOP_TITLE, BOT_TEXT_HANG_BOT, BOT_TEXT_HANG_ANONYMOUS, BOT_TEXT_HANG_CHANNEL,
}, },
}; };
@@ -106,6 +106,18 @@ impl CommandHandler {
match reply.from() { match reply.from() {
Some(user) => { Some(user) => {
if user.is_bot {
return self.send_text_reply(bot, reply, BOT_TEXT_HANG_BOT.to_string()).await
}
if user.is_anonymous() {
return self.send_text_reply(bot, reply, BOT_TEXT_HANG_ANONYMOUS.to_string()).await
}
if user.is_channel() {
return self.send_text_reply(bot, reply, BOT_TEXT_HANG_CHANNEL.to_string()).await
}
let is_self = match message.from() { let is_self = match message.from() {
Some(f) => f.first_name == user.first_name, Some(f) => f.first_name == user.first_name,
None => false, None => false,
@@ -125,7 +137,8 @@ impl CommandHandler {
BOT_TEXT_HANGED[index] BOT_TEXT_HANGED[index]
}; };
vars.insert("name".to_string(), user.first_name.as_str()); let name = escape(user.first_name.as_str());
vars.insert("name".to_string(), name.as_str());
let _ = self let _ = self
.controller .controller
@@ -162,7 +175,7 @@ impl CommandHandler {
for result in results { for result in results {
let mut vars: HashMap<String, String> = HashMap::new(); let mut vars: HashMap<String, String> = HashMap::new();
vars.insert("name".to_string(), result.name); vars.insert("name".to_string(), escape(result.name.as_str()));
vars.insert("count".to_string(), result.counts.to_string()); vars.insert("count".to_string(), result.counts.to_string());
let record = BOT_TEXT_TOP_TEMPLATE.format(&vars).unwrap(); let record = BOT_TEXT_TOP_TEMPLATE.format(&vars).unwrap();

View File

@@ -1,10 +1,13 @@
use clap::Parser; use clap::Parser;
use shadow_rs::shadow;
const DEFAULT_DATABASE: &'static str = "sqlite:///hangitbot.db"; const DEFAULT_DATABASE: &'static str = "sqlite:///hangitbot.db";
const DEFAULT_API_URL: &'static str = "https://api.telegram.org"; const DEFAULT_API_URL: &'static str = "https://api.telegram.org";
shadow!(build);
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)] #[clap(author, version=build::TAG, about, long_about = None)]
pub struct Args { pub struct Args {
/// Enable debug mode /// Enable debug mode
#[clap(short = 'D', long, value_parser, default_value_t = false)] #[clap(short = 'D', long, value_parser, default_value_t = false)]

View File

@@ -1,12 +1,12 @@
use migration::{Migrator, MigratorTrait}; use migration::{Migrator, MigratorTrait};
use models::prelude::*; use models::prelude::*;
use sea_orm::{ use sea_orm::{
ActiveModelTrait, ColumnTrait, ConnectionTrait, Database, DatabaseConnection, prelude::BigDecimal, ActiveModelTrait, ColumnTrait, ConnectionTrait, Database,
DbErr, EntityTrait, QueryFilter, QueryOrder, QuerySelect, QueryTrait, Set, TransactionTrait, FromQueryResult, prelude::BigDecimal, DatabaseConnection, DbErr, EntityTrait, FromQueryResult, QueryFilter, QueryOrder, QuerySelect,
QueryTrait, Set, TransactionTrait,
}; };
use teloxide::types::{Chat, ChatId}; use teloxide::types::{Chat, ChatId};
use wd_log::{log_debug_ln, log_error_ln, log_info_ln, log_warn_ln}; use wd_log::{log_debug_ln, log_error_ln, log_info_ln};
#[derive(Debug, FromQueryResult)] #[derive(Debug, FromQueryResult)]
pub struct TopData { pub struct TopData {
@@ -14,7 +14,6 @@ pub struct TopData {
pub counts: BigDecimal, pub counts: BigDecimal,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Controller { pub struct Controller {
db: DatabaseConnection, db: DatabaseConnection,
@@ -31,8 +30,9 @@ impl Controller {
/// Do migrate /// Do migrate
pub async fn migrate(&self) -> Result<(), DbErr> { pub async fn migrate(&self) -> Result<(), DbErr> {
if let Err(err) = Migrator::install(&self.db).await { if let Err(err) = Migrator::install(&self.db).await {
log_warn_ln!("{}", err) return Err(err);
} }
if let Err(err) = Migrator::up(&self.db, None).await { if let Err(err) = Migrator::up(&self.db, None).await {
Err(err) Err(err)
} else { } else {
@@ -81,16 +81,6 @@ impl Controller {
} }
}; };
let query = match chat.is_group() || chat.is_supergroup() {
true => {
Stats::find()
.filter(StatsColumn::GroupId.eq(chat.id.0))
.order_by_desc(StatsColumn::Counts)
.limit(LIMIT).into_model()
.all(&transcation)
.await
}
false => {
let query = Stats::find() let query = Stats::find()
.select_only() .select_only()
.column(StatsColumn::Name) .column(StatsColumn::Name)
@@ -99,17 +89,20 @@ impl Controller {
.order_by_desc(StatsColumn::Counts.sum()) .order_by_desc(StatsColumn::Counts.sum())
.limit(LIMIT); .limit(LIMIT);
let query = match chat.is_group() || chat.is_supergroup() {
true => query.filter(StatsColumn::GroupId.eq(chat.id.0)),
false => query,
};
log_debug_ln!( log_debug_ln!(
"SQL: {:?}", "SQL: {:?}",
query.build(transcation.get_database_backend()).to_string() query.build(transcation.get_database_backend()).to_string()
); );
query.into_model().all(&transcation).await let result = query.into_model().all(&transcation).await;
}
};
match query { match result {
Ok(query) => Some(query), Ok(result) => Some(result),
Err(error) => { Err(error) => {
log_error_ln!("{}", error); log_error_ln!("{}", error);
None None

View File

@@ -56,7 +56,7 @@ async fn main() {
Ok(_r) => { Ok(_r) => {
log_debug_ln!("will send: {:?}", _r.text()); log_debug_ln!("will send: {:?}", _r.text());
Ok(()) Ok(())
}, }
Err(err) => { Err(err) => {
log_error_ln!("{:?}", err); log_error_ln!("{:?}", err);
Err(err) Err(err)

View File

@@ -34,3 +34,7 @@ pub const BOT_TEXT_HANGED_SELF: [&str; 3] = [
BOT_TEXT_HANGED_SELF_2, BOT_TEXT_HANGED_SELF_2,
BOT_TEXT_HANGED_SELF_3, BOT_TEXT_HANGED_SELF_3,
]; ];
pub const BOT_TEXT_HANG_BOT: &'static str = "机器人是无法被吊死的……";
pub const BOT_TEXT_HANG_CHANNEL: &'static str = "这是个频道……";
pub const BOT_TEXT_HANG_ANONYMOUS: &'static str = "这是个幽灵……";