 |

01.03.2025, 11:52
|
|
Новичок
Регистрация: 02.10.2024
Сообщений: 8
С нами:
851223
Репутация:
3
|
|
Приветствую смотрящих. В общем, у меня есть бот в телеграмм, в котором обычный пользователь заполняет анкету на выход своего релиза, после чего эта анкета отправляется на модерацию. Вместе с анкетой пользователя, к сообщению с анкетой прикрепляются кнопки "Одобрить" и "Отклонить" для модератора. Как мне сделать так, чтобы эти кнопки работали по принципу: Модератор нажимает на кнопку "Одобрить" и обычному пользователю отправляется сообщение о том, что его релиз был одобрен. Нажав кнопку "Отклонить", модератор должен будет указать причину, с которой он отклонил релиз пользователя, и после чего, бот отправил бы сообщение обычному пользователю, что его релиз был отклонён и прикреплял бы причину, которую ввёл модератор. Кто сможет помочь? Весь код готов буду прикрепить, если это необходимо
|
|
|

21.03.2025, 04:55
|
|
Участник форума
Регистрация: 31.12.2022
Сообщений: 201
С нами:
1774087
Репутация:
33
|
|
оно?
1742518593206.pngDickson · 21 Мар 2025 в 03:55' data-fancybox="lb-post-1593467" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/266007/" style="cursor: pointer;" title="1742518593206.png">

1742518607369.pngDickson · 21 Мар 2025 в 03:55' data-fancybox="lb-post-1593467" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/266008/" style="cursor: pointer;" title="1742518607369.png">
код снизу
Сообщение от Спойлер
python:
Код:
import
asyncio
from
aiogram
import
Bot
,
Dispatcher
,
types
from
aiogram
.
filters
import
Command
from
aiogram
.
fsm
.
context
import
FSMContext
from
aiogram
.
fsm
.
state
import
State
,
StatesGroup
from
aiogram
.
fsm
.
storage
.
memory
import
MemoryStorage
from
aiogram
.
types
import
InlineKeyboardButton
,
InlineKeyboardMarkup
from
sqlalchemy
import
create_engine
,
Column
,
Integer
,
String
,
DateTime
from
sqlalchemy
.
orm
import
declarative_base
,
sessionmaker
from
datetime
import
datetime
BOT_TOKEN
=
'token'
MODERATOR_ID
=
id
bot
=
Bot
(
token
=
BOT_TOKEN
)
storage
=
MemoryStorage
(
)
dp
=
Dispatcher
(
storage
=
storage
)
engine
=
create_engine
(
'sqlite:///test.db'
)
Base
=
declarative_base
(
)
Session
=
sessionmaker
(
bind
=
engine
)
class
ReleaseRegistration
(
Base
)
:
__tablename__
=
'releases'
id
=
Column
(
Integer
,
primary_key
=
True
)
user_id
=
Column
(
Integer
,
nullable
=
False
)
full_name
=
Column
(
String
,
nullable
=
False
)
contact
=
Column
(
String
,
nullable
=
False
)
status
=
Column
(
String
,
default
=
'pending'
)
rejection_reason
=
Column
(
String
)
created_at
=
Column
(
DateTime
,
default
=
datetime
.
utcnow
)
Base
.
metadata
.
create_all
(
engine
)
class
Form
(
StatesGroup
)
:
full_name
=
State
(
)
contact
=
State
(
)
waiting_for_rejection_reason
=
State
(
)
@dp.message
(
Command
(
"start"
)
)
async
def
cmd_start
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
await
message
.
answer
(
"Здравствуйте! Давайте зарегистрируем вас. Введите своё ФИО:"
)
await
state
.
set_state
(
Form
.
full_name
)
@dp.message
(
Form
.
full_name
)
async
def
process_full_name
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
await
state
.
update_data
(
full_name
=
message
.
text
)
await
message
.
answer
(
"Введи контакт (телефон или email):"
)
await
state
.
set_state
(
Form
.
contact
)
@dp.message
(
Form
.
contact
)
async
def
process_contact
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
user_data
=
await
state
.
get_data
(
)
user_id
=
message
.
from_user
.
id
session
=
Session
(
)
registration
=
ReleaseRegistration
(
user_id
=
user_id
,
full_name
=
user_data
[
'full_name'
]
,
contact
=
message
.
text
)
session
.
add
(
registration
)
session
.
commit
(
)
# Отправка анкеты модератору с кнопками
registration_text
=
(
f"Заявка на регистрацию:\n"
f"ФИО:{user_data['full_name']}\n"
f"Контакт:{message.text}"
)
keyboard
=
InlineKeyboardMarkup
(
inline_keyboard
=
[
[
InlineKeyboardButton
(
text
=
"Одобрить"
,
callback_data
=
f"approve_{registration.id}"
)
]
,
[
InlineKeyboardButton
(
text
=
"Отклонить"
,
callback_data
=
f"reject_{registration.id}"
)
]
]
)
await
bot
.
send_message
(
MODERATOR_ID
,
registration_text
,
reply_markup
=
keyboard
)
await
message
.
answer
(
"Заявка отправлена на модерацию!"
)
await
state
.
clear
(
)
session
.
close
(
)
@dp.callback_query
(
lambda
c
:
c
.
data
.
startswith
(
"approve_"
)
)
async
def
process_approve
(
callback
:
types
.
CallbackQuery
)
:
registration_id
=
int
(
callback
.
data
.
split
(
"_"
)
[
1
]
)
session
=
Session
(
)
registration
=
session
.
query
(
ReleaseRegistration
)
.
filter_by
(
id
=
registration_id
)
.
first
(
)
if
registration
and
registration
.
status
==
'pending'
:
registration
.
status
=
'approved'
session
.
commit
(
)
# Уведомление пользователю об одобрении
await
bot
.
send_message
(
registration
.
user_id
,
f"Ваша заявка на регистрацию одобрена! Скоро свяжемся с вами через{registration.contact}"
)
await
callback
.
message
.
edit_text
(
f"{callback.message.text}\n\nСтатус: Одобрено"
,
reply_markup
=
None
)
session
.
close
(
)
await
callback
.
answer
(
)
@dp.callback_query
(
lambda
c
:
c
.
data
.
startswith
(
"reject_"
)
)
async
def
process_reject
(
callback
:
types
.
CallbackQuery
,
state
:
FSMContext
)
:
registration_id
=
int
(
callback
.
data
.
split
(
"_"
)
[
1
]
)
session
=
Session
(
)
registration
=
session
.
query
(
ReleaseRegistration
)
.
filter_by
(
id
=
registration_id
)
.
first
(
)
if
registration
and
registration
.
status
==
'pending'
:
await
state
.
update_data
(
registration_id
=
registration_id
)
await
state
.
set_state
(
Form
.
waiting_for_rejection_reason
)
await
callback
.
message
.
edit_text
(
f"{callback.message.text}\n\nВведи причину отклонения:"
)
session
.
close
(
)
await
callback
.
answer
(
)
@dp.message
(
Form
.
waiting_for_rejection_reason
)
async
def
process_rejection_reason
(
message
:
types
.
Message
,
state
:
FSMContext
)
:
data
=
await
state
.
get_data
(
)
registration_id
=
data
.
get
(
"registration_id"
)
reason
=
message
.
text
session
=
Session
(
)
registration
=
session
.
query
(
ReleaseRegistration
)
.
filter_by
(
id
=
registration_id
)
.
first
(
)
if
registration
and
registration
.
status
==
'pending'
:
registration
.
status
=
'rejected'
registration
.
rejection_reason
=
reason
session
.
commit
(
)
# Уведомление пользователю об отклонении
await
bot
.
send_message
(
registration
.
user_id
,
f"Твой релиз отклонён.\nПричина:{reason}"
)
await
message
.
answer
(
f"Заявка:\nФИО:{registration.full_name}\nКонтакт:{registration.contact}\n\nСтатус: Отклонено\nПричина:{reason}"
)
session
.
close
(
)
await
state
.
clear
(
)
async
def
main
(
)
:
await
dp
.
start_polling
(
bot
)
if
__name__
==
"__main__"
:
asyncio
.
run
(
main
(
)
)
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|