PDA

Просмотр полной версии : бот вк


Kecer
24.01.2022, 17:55
Добрый день, пишу бота вк и хотел бы найти замену на регулярные вырежния

JavaScript:






bot
.
hear
(
/^(?:!test) (.*)$/i
,
msg
=>
{
msg
.
send
(
`${msg.$match[1]}`
)
}
)




В общем проблема в том что когда я делаю 2 и более регулярных выражения, то-есть (.*) (.*) То в таком случае оно принимает одно слово, это и логично, но как сделать так что бы одно из регулярных выражений принимало несколько слов? без ограничений

meowprd
24.01.2022, 18:26
с js особо не дружу

пример ввода:


!test string1 string2


регулярка:


^!test (\w+) (\w+)$


https://forum.antichat.xyz/attachments/27953838/

chapo
24.01.2022, 18:27
(.+)(%s+)(.+)

Kecer
24.01.2022, 18:34
(.+)(%s+)(.+)



Го реально работает спасибки, ещё такой вопрос можно ли как-то проверку на эти регулярки сделать то есть допустим как пример

if(!msg.$match[2]) return msg.send('Вы не указали параметр')

Liquit
24.01.2022, 18:50
регулярки может и удобно, но я предлагаю реализовать немного по удобнее, например так:

JavaScript:






if
(
ctx
.
text
.
startsWith
(
prefix
)
)
{
let
msgToParse
=
ctx
.
text
.
slice
(
prefix
.
length
)
// чикчирикаем префикс
let
params
=
msgToParse
.
split
(
" "
)
// парсим строку
let
cmd
=
params
[
0
]
// получаем переменную
// все остальные параметры - params[1], params[2] и так далее, в зависимости от того, что нужно сделать
}




так, я думаю будет удобнее работать с параметрами

вот, к примеру реализация простейшей команды, которая будет приветствовать пользователя(я не претендую на красивый код, давно писал, сам знаю что фигово написано, лучше промисом сделать)

JavaScript:






if
(
cmd
==
"get"
&&
params
[
1
]
.
length
!=
0
)
{
let
user
await
vk
.
api
.
users
.
get
(
{
user_ids
:
getIdFromString
(
params
[
1
]
)
}
)
.
then
(
res
=>
{
user
=
res
}
)
console
.
log
(
user
[
0
]
.
first_name
)
if
(
user
)
{
ctx
.
send
(
`Hello, [id${user[0].id}|${user[0].first_name}]`
)
}
}

Kecer
24.01.2022, 18:58
регулярки может и удобно, но я предлагаю реализовать немного по удобнее, например так:

JavaScript:






if
(
ctx
.
text
.
startsWith
(
prefix
)
)
{
let
msgToParse
=
ctx
.
text
.
slice
(
prefix
.
length
)
// чикчирикаем префикс
let
params
=
msgToParse
.
split
(
" "
)
// парсим строку
let
cmd
=
params
[
0
]
// получаем переменную
// все остальные параметры - params[1], params[2] и так далее, в зависимости от того, что нужно сделать
}




так, я думаю будет удобнее работать с параметрами
вот, к примеру реализация простейшей команды, которая будет приветствовать пользователя(я не претендую на красивый код, давно писал, сам знаю что фигово написано, лучше промисом сделать)

JavaScript:






if
(
cmd
==
"get"
&&
params
[
1
]
.
length
!=
0
)
{
let
user
await
vk
.
api
.
users
.
get
(
{
user_ids
:
getIdFromString
(
params
[
1
]
)
}
)
.
then
(
res
=>
{
user
=
res
}
)
console
.
log
(
user
[
0
]
.
first_name
)
if
(
user
)
{
ctx
.
send
(
`Hello, [id${user[0].id}|${user[0].first_name}]`
)
}
}





Очень заморочено, код у меня большой, и всё подстроить под это будет очень сложно потому-что регулярки у меня используется почти везде

Liquit
24.01.2022, 19:09
Очень заморочено, код у меня большой, и всё подстроить под это будет очень сложно потому-что регулярки у меня используется почти везде


ну переделай остальное, так код хотя бы становится более читабельней

Kecer
24.01.2022, 19:30
(.+)(%s+)(.+)



поспешил я с выводами, оно так же криво работает как и работало ранее, мб чёто не так делаю можно пример?

feelzyourertry
24.01.2022, 19:31
мужики подобная ***ня приносит свои плоды в виде бабок?

Kecer
24.01.2022, 19:37
мужики подобная ***ня приносит свои плоды в виде бабок?


Ты хочешь что бы я тебе заплатил денег за то что ты уделишь мне 3 - 4 минуты?

molimawka
24.01.2022, 20:23
Очень заморочено, код у меня большой, и всё подстроить под это будет очень сложно потому-что регулярки у меня используется почти везде


тогда в чем проблема сделать так?

JavaScript:






bot
.
hear
(
/^(?:!test) (.*)$/i
,
msg
=>
{
const
params
=
msg
.
$match
[
1
]
.
split
(
" "
)
msg
.
send
(
JSON
.
stringify
(
params
)
)
}
)




Будет у тебя в params массив всех слов которые были указаны через пробел

Kecer
24.01.2022, 20:36
тогда в чем проблема сделать так?

JavaScript:






bot
.
hear
(
/^(?:!test) (.*)$/i
,
msg
=>
{
const
params
=
msg
.
$match
[
1
]
.
split
(
" "
)
msg
.
send
(
JSON
.
stringify
(
params
)
)
}
)




Будет у тебя в params массив всех слов которые были указаны через пробел


в таком случае оно в таком формате выводить, как это убрать?

molimawka
24.01.2022, 20:37
в таком случае оно в таком формате выводить, как это убрать?


Ты на каком уровне жс знаешь)) Какой формат вывода тебе надо?

Kecer
24.01.2022, 20:37
в таком случае оно в таком формате выводить, как это убрать?



https://forum.antichat.xyz/attachments/27953984/

molimawka
24.01.2022, 20:38
Так спрашиваю, какой формат вывода тебе надо??

Kecer
24.01.2022, 20:39
Так спрашиваю, какой формат вывода тебе надо??


как обычный текст

https://forum.antichat.xyz/attachments/27953989/




В приоритете у меня сделать команду кик с причиной, команда у меня уже есть, но когда я ввожу причину у меня вводится туда последнее слово, а первое слово вводится в msg.$match[1] то-есть туда где нужно указывать айди пользователя

molimawka
24.01.2022, 20:48
В приоритете у меня сделать команду кик с причиной, команда у меня уже есть, но когда я ввожу причину у меня вводится туда последнее слово, а первое слово вводится в msg.$match[1] то-есть туда где нужно указывать айди пользователя


Можно так:

JavaScript:






bot
.
hear
(
/^(?:!test) (\w+) (.*)$/i
,
msg
=>
{
msg
.
send
(
`ID:${msg.$match[1]}\n Reason:${msg.$match[2]}`
)
}
)




Или так:

JavaScript:






bot
.
hear
(
/^(?:!test) (.*)$/i
,
msg
=>
{
const
params
=
msg
.
$match
[
1
]
.
split
(
" "
)
const
id
=
params
.
shift
(
)
const
reason
=
params
.
join
(
" "
)
msg
.
send
(
`ID:${id}\nReason:${reason}`
)
}
)

Kecer
24.01.2022, 20:59
Можно так:

JavaScript:






bot
.
hear
(
/^(?:!test) (\w+) (.*)$/i
,
msg
=>
{
msg
.
send
(
`ID:${msg.$match[1]}\n Reason:${msg.$match[2]}`
)
}
)




Или так:

JavaScript:






bot
.
hear
(
/^(?:!test) (.*)$/i
,
msg
=>
{
const
params
=
msg
.
$match
[
1
]
.
split
(
" "
)
const
id
=
params
.
shift
(
)
const
reason
=
params
.
join
(
" "
)
msg
.
send
(
`ID:${id}\nReason:${reason}`
)
}
)





слушай, первый способ я так и делал примерно, он не очень хорошо работал, а вот второй это просто бомба, ты мне спас несколько лет моих мучений ОГРОМНОЕ ТЕБЕ СПАСИБО, если не сложно объясни что значит эти три константы в 2 способе, на будущее будет полезно, заранее тебе спасибки

neverlane
27.01.2022, 13:59
слушай, первый способ я так и делал примерно, он не очень хорошо работал, а вот второй это просто бомба, ты мне спас несколько лет моих мучений ОГРОМНОЕ ТЕБЕ СПАСИБО, если не сложно объясни что значит эти три константы в 2 способе, на будущее будет полезно, заранее тебе спасибки


params - аргументы в виде массива, разделенные пробелом

id - первый элемент из массива(он так же удалятся из массива)

reason - все остальные элементы массива соединенные пробелом с помощью join