first commit

This commit is contained in:
doryan04 2024-02-12 00:14:12 +04:00
commit 44de5a191a
12 changed files with 2147 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/target

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

11
.idea/doryan-facker.iml Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/doryan-facker.iml" filepath="$PROJECT_DIR$/.idea/doryan-facker.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

1776
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

13
Cargo.toml Normal file
View File

@ -0,0 +1,13 @@
[package]
name = "doryan-facker"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
teloxide = { version = "0.12", features = ["macros"] }
log = "0.4"
pretty_env_logger = "0.5.0"
tokio = { version = "1.8", features = ["rt-multi-thread", "macros"] }
chrono = "0.4.34"

62
src/ban.rs Normal file
View File

@ -0,0 +1,62 @@
pub mod ban{
use teloxide::Bot;
use teloxide::requests::Requester;
use teloxide::types::{ChatId, Message, MessageKind};
pub async fn ban_user(
replied_message: Option<&Message>,
reason: Option<String>,
bot: &Bot,
chat_id: ChatId) -> Result<String, String>
{
if let None = replied_message {
bot.send_message(
chat_id,
"Ответьте на сообщение человека, которого вы хотите забанить".to_string()
).await.unwrap();
Err("Ответьте на сообщение человека, которого вы хотите забанить".to_string())
} else if let None = reason {
bot.send_message(chat_id, "Не указана причина бана").await
.unwrap();
Err("Не указана причина бана".to_string())
} else {
match &replied_message.unwrap().kind {
MessageKind::Common(message) => {
if let None = message.from {
bot.send_message(chat_id, "Сообщение не найдено")
.await
.unwrap();
Err("Сообщение не найдено".to_string())
} else if let Some(user) = &message.from {
match bot.ban_chat_member(chat_id, user.id).await {
Ok(_) => {
bot.send_message(
chat_id,
format!("Пользователь {} был заблокирован по причине {}",
user.first_name,
reason.unwrap()
)
).await.unwrap();
Ok("Демократия была совершена".to_string())
}
Err(error) => {
bot.send_message(chat_id, error.to_string())
.await
.unwrap();
Err(error.to_string())
}
}
} else {
bot.send_message(chat_id, "Ошибка номер хуй")
.await
.unwrap();
Err("Ошибка номер хуй".to_string())
}
}
_ => {
Err("тест".to_string())
}
}
}
}
}

39
src/is_admin.rs Normal file
View File

@ -0,0 +1,39 @@
pub mod is_admin{
use teloxide::Bot;
use teloxide::types::Message;
use teloxide::requests::Requester;
pub async fn is_admin_check(message: &Message, bot: &Bot) -> bool {
if let None = message.from() {
bot.send_message(message.chat.id, "Пользователь не найден")
.await
.unwrap();
return false;
} else {
let is_admin = bot.get_chat_member(
message.chat.id,
message.from().unwrap().id
).await;
match is_admin {
Ok(chat_member) => {
if chat_member.is_administrator() || chat_member.is_owner() {
return true;
} else {
bot.send_message(message.chat.id, "Команда доступна только администраторам")
.await
.unwrap();
return false;
}
}
Err(error) => {
bot.send_message(message.chat.id, error.to_string())
.await
.unwrap();
return false;
}
}
}
}
}

80
src/main.rs Normal file
View File

@ -0,0 +1,80 @@
mod ban;
mod mute;
mod unmute;
mod is_admin;
use teloxide::prelude::*;
use crate::ban::ban::ban_user;
use crate::mute::mute::mute_user;
use crate::unmute::unmute::unmute;
use teloxide::utils::command::BotCommands;
use crate::is_admin::is_admin::is_admin_check;
#[tokio::main]
async fn main() {
pretty_env_logger::init();
log::info!("Starting throw dice bot...");
let bot = Bot::new("6941223962:AAG4SVKKlUOPlgJTINLfxtD09duB_YSkHOw".to_string());
Command::repl(bot, callback).await;
}
#[derive(BotCommands, Clone)]
#[command(rename_rule = "lowercase", description = "Поддерживаемые команды:")]
enum Command {
#[command(description = "Команда для отображения инструкции")]
Help,
#[command(description = "Снимается мьют."
)]
Unmute,
#[command(description = "Банит человека. Для этого необходимо \
1. Сделать реплай на сообщение человека, которого вы хотите забанить; \
2. Указать причину бана."
)]
NurgbergsCongress(String),
#[command(description = "Мьют человека. Для этого необходимо \
1. Сделать реплай на сообщение человека, которого вы хотите замьютить; \
2. Указать множитель мьюта."
)]
Mute(i64),
}
async fn callback(bot: Bot, msg: Message, commands: Command) -> ResponseResult<()> {
match commands {
Command::Help => {
bot.send_message(msg.chat.id, Command::descriptions().to_string()).await?;
},
Command::NurgbergsCongress(reason) => {
if is_admin_check(&msg, &bot).await {
let reason_result = if reason.is_empty() { None } else { Some(reason) };
let _ = ban_user(
msg.reply_to_message(),
reason_result,
&bot,
msg.chat.id,
).await;
}
},
Command::Mute(multiplier) => {
if is_admin_check(&msg, &bot).await {
let _ = mute_user(
msg.reply_to_message(),
multiplier,
&bot,
msg.chat.id,
).await;
}
}
Command::Unmute => {
if is_admin_check(&msg, &bot).await {
let _ = unmute(
msg.reply_to_message(),
&bot,
msg.chat.id,
).await;
}
}
};
Ok(())
}

81
src/mute.rs Normal file
View File

@ -0,0 +1,81 @@
pub mod mute {
use teloxide::Bot;
use chrono::{Duration, Local};
use teloxide::requests::Requester;
use teloxide::payloads::RestrictChatMemberSetters;
use teloxide::types::{ChatId, ChatPermissions, Message, MessageKind};
pub async fn mute_user(
replied_message: Option<&Message>,
multiplier: i64,
bot: &Bot,
chat_id: ChatId) -> Result<String, String>
{
if let None = replied_message {
bot.send_message(
chat_id,
"Ответьте на сообщение человека, которого вы хотите замьютить".to_string()
).await.unwrap();
Err("Ответьте на сообщение человека, которого вы хотите замьютить".to_string())
} else {
match &replied_message.unwrap().kind {
MessageKind::Common(message) => {
if let None = message.from {
bot.send_message(chat_id, "Сообщение не найдено").await.unwrap();
Err("Сообщение не найдено".to_string())
} else if let Some(user) = &message.from {
let dice_value = bot.send_dice(chat_id)
.await
.unwrap()
.dice()
.unwrap()
.value as i64;
let duration = Local::now().naive_utc() + Duration::hours(multiplier * dice_value);
println!("{:?}", duration);
match bot.restrict_chat_member(
chat_id,
user.id,
ChatPermissions::from_bits(0).unwrap()
).until_date(duration.and_utc())
.await
{
Ok(_) => {
bot.send_message(
chat_id,
format!("На пользователя {} повесили железный зановес на {} часов",
user.first_name,
multiplier * dice_value
)
).await
.unwrap();
Ok("Демократия была совершена".to_string())
}
Err(error) => {
bot.send_message(
chat_id,
error.to_string() + &*format!(
". Результат в часах: {}",
multiplier * dice_value
).to_string()
).await
.unwrap();
Err(error.to_string())
}
}
} else {
bot.send_message(chat_id, "Ошибка номер хуй")
.await
.unwrap();
Err("Ошибка номер хуй".to_string())
}
}
_ => {
Err("тест".to_string())
}
}
}
}
}

62
src/unmute.rs Normal file
View File

@ -0,0 +1,62 @@
pub mod unmute{
use teloxide::Bot;
use teloxide::requests::Requester;
use teloxide::types::{ChatId, ChatPermissions, Message, MessageKind};
pub async fn unmute(
replied_message: Option<&Message>,
bot: &Bot,
chat_id: ChatId
) -> Result<String, String>
{
if let None = replied_message {
bot.send_message(
chat_id,
"Ответьте на сообщение человека, которого вы хотите замьютить".to_string()
).await.unwrap();
Err("Ответьте на сообщение человека, которого вы хотите замьютить".to_string())
} else {
match &replied_message.unwrap().kind {
MessageKind::Common(message) => {
if let None = message.from {
bot.send_message(chat_id, "Сообщение не найдено").await.unwrap();
Err("Сообщение не найдено".to_string())
} else if let Some(user) = &message.from {
match bot.restrict_chat_member(
chat_id,
user.id,
ChatPermissions::all()
).await
{
Ok(_) => {
bot.send_message(
chat_id,
format!("C пользователя {} сняли железный зановес", user.first_name)
).await
.unwrap();
Ok("Демократия была совершена".to_string())
}
Err(error) => {
bot.send_message(
chat_id,
error.to_string().to_string()
).await
.unwrap();
Err(error.to_string())
}
}
} else {
bot.send_message(chat_id, "Ошибка номер хуй")
.await
.unwrap();
Err("Ошибка номер хуй".to_string())
}
}
_ => {
Err("тест".to_string())
}
}
}
}
}