first commit
This commit is contained in:
commit
44de5a191a
|
@ -0,0 +1 @@
|
|||
/target
|
|
@ -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
|
|
@ -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>
|
|
@ -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>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
File diff suppressed because it is too large
Load Diff
|
@ -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"
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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(())
|
||||
}
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue