SQLite server com repl.it

Olá querido leitor, hoje estarei fazendo um servidor SQLite para armazenar dados via HTTP request.

Por que?

Bom, acho que muitos sabem que as DataStores do roblox são lentas e pelos testes que eu fiz, esse servidor SQLite é até 3 vezes mais rápido que as DataStores.

Outra vantagem é que você pode acessar esses dados externamente, como num site ou em um bot do discord.

Oque utilizarei?

  • Express - Vai receber os Http requests que virão do roblox.

  • SQLite3 - Database

  • HttpService - Enviará os Http requests para o servidor.

  • repl.it - Irá deixar nossa aplicação online.

Mão na masa

Se registrando no repl.it

Primeiro, entre em repl.it, em seguide clique em “Sign up” no canto superior direito:

Em seguida, escolha como você quer se registrar, bom não há segredo.

Criando um repl

Quando estiver logado, vá para a página home e clique no botão +.

Escolha a linguagem Node.js e dê um nome a seu projeto.

Clique em Create repl.

Instalando módulos

Quando criar o projeto, abra ele e clique em Shell no lado esquerdo.

Digite npm i sqlite3 --save e pressione enter. E espere instalar.

Em seguida, digite npm i express --save e de enter. E espere instalar.

Preparando algumas coisas

Adicione um novo arquivo chamado database.db no lado esquerdo.

Após isso, crie outro arquivo chamado .env.

Por enquando, vamos deixar isso um pouco de lado.

Programando

Abra o index.js, e vamos começar com o SQLite.

Digite as seguintes linhas:


const express = require("express")

const app = express()

const port = 3000

app.use(express.json())

app.use(express.urlencoded({extended: true}))

Estamos criando uma aplicação express que vai responder aos Http requests acima.

Adicionaremos as seguintes linhas após.


app.get("/", (req, res) => {

    res.send("Hello World!")

})

app.listen(port, () => {

    console.log(`Listening port ${port}`)

})

Seu código deve estar parecido com isto aqui:

Esse código já está respondendo a Http requests com um “Hello World!”.

Vamos agora ao SQLite.

Adicione estas linhas após importar e configurar o express.


const sqlite3 = require("sqlite3").verbose()

const db = new sqlite3.Database("./database.db")

Seu código deve estar parecido com isso aqui:

Bom, agora que vamos começar realmente. Toda vez que fomos fazer um request, teremos que ter uma query uma senha e um login. A senha e o login servem para ninguém acessar o banco de dados se ela não saber a senha e nem o login. Para esconder os dois utilizaremos .env.

Vá ao seu arquivo .env e digite:


LOGIN=[login]

PASSWORD=[senha]

Substitua [login] por um login que você vai usar, e [senha] por uma senha que você vai usar. No meu caso, login e senha para este tutorial.

Volte ao index.js e adicione 2 posts e 1 função:


const validate = function(login, password) {

    return login == process.env.LOGIN && password == process.env.PASSWORD

}

app.post("/nonquery", (req, res) => {

    if (validate(req.body.login, req.body.password)) {

        db.run(req.body.query, error => {

            if (error) {

                res.send({ message: "error" });

            }

            else {

                res.send({ message: "success" });

            }

        })

    }

    else {

        res.send({ message: "invalid login or password"})

    }

})

app.post("/reader", (req, res) => {

    if (validate(req.body.login, req.body.password)) {

        db.all(req.body.query, (err, rows) => {

            res.send(rows)

        })

    }

    else {

        res.send({ message: "invalid login or password"})

    }

})

Seu código deve estar parecido com isso:

E pronto! A parte do repl.it está pronta. Agora vamos ao Roblox Studio!

Roblox Studio

Vamos importar o HttpService e utilizar ele para enviar os requests ao nosso server!

Teremos 2 funções, uma para enviar um request nonQuery (INSERT, UPDATE, CREATE, DELETE, DROP…) e um reader (SELECT).


local HttpService = game:GetService("HttpService")

local url = // Bota a url aqui

local login = // Bota seu login aqui

local password = // Bota sua senha aqui

function nonQuery(query)

    return HttpService:PostAsync(url.."/nonQuery/", HttpService:JSONEncode({query = query, login = login, password = password}))

end

function reader(query)

    return HttpService:PostAsync(url.."/reader/", HttpService:JSONEncode({query = query, login = login, password = password}))

end

Para pegarmos a URL vamos voltar ao repl.it. Clique em Run.

No canto superior direito você verá um link

Deixe a aplicação ligada e tente executar algumas queries no roblox.


print(nonQuery("CREATE TABLE IF NOT EXISTS players(Id VARCHAR(255) PRIMARY KEY, Data TEXT NOT NULL)"))

-- {"message":"success"}

print(nonQuery("INSERT INTO players VALUES('1989183', '{algum json aqui}')"))

-- {"message":"success"}

print(reader("SELECT * FROM players"))

-- [{"Id":"1989183","Data":"{algum json aqui}"}]

Finalização

E é isso, obrigado por ler até aqui. Fiquei com um bom tempo escrevendo este tutorial, mas espero que vocês gostem e que ajudem vocês.

Qualquer dúvida, crítica por favor me fale aqui nos comentários. Até a proxima.

5 Curtidas

Obrigado pelo artigo, ficou muito bom!
Uma dúvida, você sabe se o servidor no repl.it em que o banco está hospedado cair, todos os dados são perdidos?

1 Curtida

Não, quando você faz um HTTP request, ele executa a query na hora e salva no arquivo database.db, não se preocupe, se seu servidor cair o pior que pode acontecer é ele não processar as queries, mas não haverá perda de dados. Isso ocorre muito raramente e nunca tive nenhum problema com isso até hoje.

1 Curtida

Uma coisa MUITO importante que esqueci de mencionar nesse artigo: utilize o UptimeRobot. Ele serve para acessar um site por exemplo a cada X minutos, isso previne que o repl.it acabe desligando seu site por ninguém acessar ele.

É só se registrar e em seguida clicar em Add New Monitor image

Preencher essas informações
Note que o Monitor Type está como HTTP(s)
image

E depois Create Monitor
image

Ele demorará alguns minutos para iniciar e depois estará acessando seu site a cada 5 minutos por exemplo.

Ele também dá um histórico de acessos, digamos assim.
image

1 Curtida

Entendi, muito obrigado! :slight_smile:

2 Curtidas