JS Помогите с ботом вк

Статус
В этой теме нельзя размещать новые ответы.

Kecer

Участник
Автор темы
241
11
Как можно реализовать эту функцию только на примере базы данных mysql

JavaScript:
if(msg.$match[1].match(/\[id(.*)\|(.*)\]/i)){
  var u = users.filter(x => x.id == Number(msg.$match[1].split('[id')[1].split('|')[0]))[0]
}

кто не понял, эта функция ищет в json айди пользователя

Условно говоря я написал /setname @test_id Test_Name

и он фильтрует айди и ищет цифры этого айди, сам не знаю как это донести ибо в node js не так давно, но думаю не глупые люди поймут суть это функции, пользовался json как базой данных, но понял что это вообще не стабильная вещь и хочу перейти на mysql но меня останавливает то что я не понимаю как сделать похожу функцию только на примере mysql ибо уроков и чего-то подобного в инете толком нету :( Надеюсь на вашу помощь. Заранее спасибо!
 
Решение
значится
JavaScript:
const { VK } = require("vk-io");
const config = require("./config.json")
const mysql = require("mysql2/promise")

const vk = new VK({
    token: config.bot_token
})

let connection
(async () => {
    connection = await mysql.createConnection({
        host: "localhost",
        user: "oleg",
        password: "password",
        database: "main"
    })
})()

vk.updates.on("message_new", async ctx => {
    if(ctx.text.startsWith("/") && ctx.peerType == "chat") // если не команда и мы в беседе(где он и должен работать)
    {
        ctx.text += " " // костыль хуле
        let args = ctx.text.match(/^\/(?<cmd>\w+) \[id(?<id>\d+)\|(?<name>.+)](?<args>.+)/) // чтобы это гавно работало(регулярка типа)
        let cmd =...

Kecer

Участник
Автор темы
241
11
Ты хочешь это доставать из бд или туда добавлять?

Уточню, то есть, ты пишешь /setname @id name, и в бд добавляется, что чел с таким-то ид имеет такое имя?
Добавить, то-есть я пишу эту команду и он в бд этому челу присваивает ник, и потом как это же достать из бд, условно говоря написать /nickinfo @id и он мне выдаст ник этого чела
 

Liquit

Известный
282
108
значится
JavaScript:
const { VK } = require("vk-io");
const config = require("./config.json")
const mysql = require("mysql2/promise")

const vk = new VK({
    token: config.bot_token
})

let connection
(async () => {
    connection = await mysql.createConnection({
        host: "localhost",
        user: "oleg",
        password: "password",
        database: "main"
    })
})()

vk.updates.on("message_new", async ctx => {
    if(ctx.text.startsWith("/") && ctx.peerType == "chat") // если не команда и мы в беседе(где он и должен работать)
    {
        ctx.text += " " // костыль хуле
        let args = ctx.text.match(/^\/(?<cmd>\w+) \[id(?<id>\d+)\|(?<name>.+)](?<args>.+)/) // чтобы это гавно работало(регулярка типа)
        let cmd = args.groups.cmd; // команда
        let id = args.groups.id; // ид юзера в упоминании
        let name = args.groups.name // ник, [id123123|@w_aat] например
                                                  // ^ ^ ^ ^ ^
                                                 // это оно и есть
        let cargs = args.groups.args.slice(1); // .slice(1) режем костыль который бахнули на 22
        let user = `[id${id}|${name}]` // для удобства хуле
        if(cmd == "setnick") {
            let res = await connection.execute(`SELECT * from users WHERE (user_id = ? AND peer_id = ?)`, [id, ctx.peerId]) // чекаем есть ли там уже значение
            if (res[0].length == 0) { // нету(эта либа возращает результат так:
                /*
                * res[0] = сам результат, массив(или единственное значение, как в нашем случае, потому что в одной беседе у пользователя может быть только один ник)
                * res[1] = параметры запроса, нам они не нужны
                * )*/
                await connection.execute(`INSERT INTO users (user_id, name, peer_id) VALUES (?, ?, ?)`, [id, cargs, ctx.peerId]) // добавляем значение, ибо его ещё нету
                ctx.reply(`${user}'s nickname now ${cargs}`)
            } else { // значение есть, обновляем
                await connection.execute("UPDATE users SET name = ?", [cargs])
                ctx.reply(`${user}'s nickname updated to ${cargs}`)
            }
        }
        if(cmd == "getnick") {
            let res = await connection.execute(`SELECT * from users WHERE (user_id = ? AND peer_id = ?)`, [id, ctx.peerId]) // получаем все(в нашем случае единственное) значения(-е)
            if(res[0].length == 0) ctx.reply(`${user} doesn't have any nickname`) // вернуло res[0] = [], т.е. у пользователя нету ника
            else { // у чела есть ник, выводим
                ctx.reply(`${user}'s name is ${res[0][0].name}`)
            }
        }
    }
})

vk.updates.start()

это сам код, попытался все моменты расписать
вот схема таблицы:
1654153102049.png
можно добавлять свои столбцы, но для этого кода ничего более не нужно

код - говно, ибо писался на коленке, некоторые моменты можно улучшить, но это сделано чисто для примера
p.s. бд локальная, не ломайте пжпжпжж
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.