PDA

Просмотр полной версии : Дискорд бот на питоне реагирует на команду как на текст и как на команду. Как решить эту проблему?


histor
21.02.2023, 19:46
Проблема в том, что бот на команду "#rand" реагирует не только как на команду, но и как на обычный текст. Мне надо чтобы бот реагировал на команду только как на команду и игнорировал её как текст.

main:






import
discord
import
random
from
discord
.
ext
import
commands

config
=
{
'token'
:
''
,
'prefix'
:
'#'
,
}
intents
=
discord
.
Intents
.
default
(
)
intents
.
presences
=
True
intents
.
members
=
True
intents
.
message_content
=
True
bot
=
commands
.
Bot
(
command_prefix
=
config
[
'prefix'
]
,
intents
=
intents
)
@bot.command
(
)
async
def
rand
(
ctx
)
:
await
ctx
.
reply
(
random
.
randint
(
0
,
100
)
)
@bot.event
async
def
on_message
(
ctx
)
:
await
bot
.
process_commands
(
ctx
)
if
ctx
.
author
!=
bot
.
user
:
if
ctx
.
channel
.
name
==
"bot-test"
:
await
ctx
.
reply
(
'Ты '
+
ctx
.
channel
.
name
)
bot
.
run
(
config
[
'token'
]
)




https://i.stack.imgur.com/e041d.png

не обращайте внимание на никнеймы... локальные приколы, ничего более

Dmitriy Makarov
21.02.2023, 21:17
Как вариант, можно в on_message добавить проверку на то, что текст не начинается с префикса для команд.

Python:






if
ctx
.
author
!=
bot
.
user
:
if
ctx
.
channel
.
name
==
"bot-test"
:
if
not
ctx
.
content
.
startswith
(
config
[
"prefix"
]
)
:
await
ctx
.
reply
(
'Ты '
+
ctx
.
channel
.
name
)

histor
21.02.2023, 21:39
Как вариант, можно в on_message добавить проверку на то, что текст не начинается с префикса для команд.

Python:






if
ctx
.
author
!=
bot
.
user
:
if
ctx
.
channel
.
name
==
"bot-test"
:
if
not
ctx
.
content
.
startswith
(
config
[
"prefix"
]
)
:
await
ctx
.
reply
(
'Ты '
+
ctx
.
channel
.
name
)





Да, но тогда бот будет игнорировать любые сообщение начинающиеся с '#' даже когда они не являются командой

Dmitriy Makarov
22.02.2023, 00:38
Да, но тогда бот будет игнорировать любые сообщение начинающиеся с '#' даже когда они не являются командой


Ну создай список с командами своими и ищи совпадения в чате. 🙂

Python:






# Где-то в начале
cmds
=
[
"cmd1"
,
"cmd2"
,
"cmd3"
,
]
# on_message
if
not
ctx
.
content
in
cmds
:
await
ctx
.
reply
(
"Ты "
+
ctx
.
channel
.
name
)




Ты можешь через

string.format

добавить в проверке префикс свой. Ну или же вручную в массиве ставить.

histor
22.02.2023, 05:04
Ну создай список с командами своими и ищи совпадения в чате. 🙂

Python:






# Где-то в начале
cmds
=
[
"cmd1"
,
"cmd2"
,
"cmd3"
,
]
# on_message
if
not
ctx
.
content
in
cmds
:
await
ctx
.
reply
(
"Ты "
+
ctx
.
channel
.
name
)




Ты можешь через

string.format

добавить в проверке префикс свой. Ну или же вручную в массиве ставить.


Я думал так сделать, но мне не хватило навыков чтобы каждый элемент в массиве соединять с '#'. Думал, что когда будет большое количество функций, то тогда бот будет медленнее работать из за цикла. Все равно спасибо, пожалуй так и сделаю.

riverya4life
20.04.2023, 16:45
Куда проще и эффективнее команды делать через @bot.command()