Gostaria de fazer parte da equipe do xTibia? Ajude a comunidade tibiana, faça a diferença entre os membros. Acesse o tópico aqui e participe :)

Welcome to xTibia - Sua comunidade de Otserv e Tibia

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Jovial

Tutorial De Luasql

20 posts neste tópico

Postado (editado) · Denunciar post

Tutorial de LuaSQL



Créditos: Jovial

 

Olá pessoal, estou aqui para ensinar um pouco de LuaSQL para vocês. Este tutorial foi feito por mim, Palmares me deu uma mão no fim, procurando erros. Espero que eu consiga explicar bem, para entender melhor o tutorial leia um tutorial ensinando os comandos de SQL(INSERT, CREATE, UPDATE, etc.).

Não são todos os servers que possuem o LuaSQL, você pode usar o Forgotten Server.

 

Para ver este tutorial em forma de imagem

Registre-se para ver link(s).

.

 

 

O que é LuaSQL?

LuaSQL é uma interface simples entre Lua e um sistema gerenciador de banco de dados (DBMS). Ela permite que um programa Lua:

* Conecte-se aos bancos de dados ODBC, ADO, Oracle, MySQL, SQLite, JDBC e PostgreSQL;

* Execute comandos arbritários do SQL;

* Recupere resultados no modo linha-a-linha de um cursor SQL.

LuaSQL é um software livre e utiliza a mesma licença do Lua 5.0.

Manual:

Registre-se para ver link(s).

 

Conexão

 

Antes de você adicionar/modificar informações no seu banco de dados, você precisa se conectar a ele, primeiro tempos que criar o 'ambiente' de conexão, onde você ira definir que tipo de banco de dados está usando, Exemplo.

assert(luasql.mysql()) para MySQL
assert(luasql.sqlite3()) para SQLite

Para fazer a conecção temos que salvar esse 'ambiente' em uma variável, Exemplo.

environment = assert(luasql.mysql())
ou
environment = assert(luasql.sqlite3())

A função para se conectar com o banco de dados tem a seguinte sintaxe:

connection = assert(environment:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) para MySQL
ou
connection = assert(environment:connect(sqliteDatabase)) para SQLite

Como vocês podem ver, no exemplo acima eu 'guardei' a conexão em uma variável chamada 'connection', para poder executar os comandos depois.

 

Variáveis da conexão em Mysql

 

Como vocês podem ver na conexão com MySQL Precisamos saber 5 coisas mysqlDatabase, mysqlUser, mysqlPass, mysqlHost e mysqlPort.

mysqlDatabase é o Banco o nome do Banco de Dados que você deseja usar, Exemplo: o Forgotten Server usa o 'theforgottenserver'(se você não alterou).
mysqlUser é o usuário usado para se conectar com o MySQL, geralmente é 'root'.
mysqlPass é a senha usada para a conexão com o Mysql.
mysqlHost é o ip de onde se encontra o servidor de MySQL, como ele deverá estar no seu computador deixe como 'localhost'.
mysqlPort é a porta usada para a conexão com o MySQL, use a porta '3306'.
Ficando:
connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))

 

Variáveis da conexão em SQLite

 

Para criar uma conexão só é preciso saber o sqliteDatabase, que no forgotten server é 'forgottenserver.s3db', como podem ver, é o nome do arquivo que ira abrigar o banco de dados.

Ficando:

connection = assert(environment:connect('forgottenserver.s3db'))

 

Finalizando uma conexão

 

Para finalizar uma conexão você precisa usar os seguintes comandos:

connection:close() para fechar sua conexão(troque connection pela variável que você armazenou sua conexão)
e
environment:close() para fechar seu 'ambiente' de conexão(troque environment pela variável que você armazenou seu 'ambiente')

 

Executando comandos

 

Para executar algum comando SQL em lua usamos uma função com a seguinte sintaxe:

assert(connection:execute('Comando SQL'))

Exemplo:

assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ('222222', 'tibia', '1', '365');"))
Isto irá criar uma conta 222222/tibia do tipo 1(conta normal) com 365 dias de premium.

 

Pegando informações

 

Para pegar alguma informação de seu banco de dados você precisará salvar seu comando em uma variável, Exemplo:

cursor = assert(connection:execute("SELECT `password` FROM `accounts` WHERE `id` = '222222';"))
Nesse caso coloquei um comando que ira pegar o valor de 'password' na tabela accounts onde o id(numero da conta) for 222222.

Agora para pegar informações dessa variável, no caso 'cursor', você ira ter que usar algumas funções como:

numrows() Retorna: o número de registros no resultado da busca.
fetch() Recupera o próximo registro do resultado.

Você ira ver como usá-los logo abaixo nos exemplos.

 

Exemplos

 

TalkAction que cria account.

Tag: <talkaction words="/createacc" script="account.lua"/>

Modo de usar: Dizer '/createacc "222222/tibia' isso irá criar uma conta 222222/tibia

function onSay(cid, words, param)
--TalkAction by Jovial
if (getPlayerAccess(cid) > 3) then
	tmp,tmp2,acc,pass = string.find(param,'(%d*)/(%w*)') 
	--Esta linha acima pega os valores digitados na fala do player e separa eles em account e senha.
	--Tutorial de patterns em ingles: http://lua-users.org/wiki/PatternsTutorial
	if (acc ~= nil and pass ~= nil) then
		environment = assert(luasql.mysql())
		--Criamos um ambiente de conexão
		connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))
		--Agora nos conectamso com o MySQL (não esqueça de colocar sua senha acima)

		ccursor = assert(connection:execute("SELECT * FROM `accounts` WHERE `id` = `"..acc.."`;"))
		--Esta linha seleciona os valores da tabela accounts onde o id(numero da conta) for igual ao que você digitou, para verificar se a conta existe.

		if (cursor:numrows() == 0) then
			--cursor:numrows() retorna a quantidade de resultados, neste caso se eel retornar mais de 0 é porque a conta ja existe, se retornar 0 ela não existe.
			assert(connection:execute("INSERT INTO `accounts` (`id`, `password`, `type`, `premdays`) VALUES ("..acc..", "..pass..", 1, 0);"))
			--Aqui ele ira criar a nova conta.
			doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Account created.)')
		else
			doPlayerSendCancel(cid,'This account already exists.')
			doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (This account already exists.)')
		end

		connection:close()
		--Fechando a conexão
		environment:close()
		--Fechando o ambiente de conexão
	else
		doPlayerSendCancel(cid,'Invalid account or password.')
		doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,words..' "'..param..' (Invalid account or password.)')
	end
else
	doPlayerSendCancel(cid,'You can not use this command.')
end
return FALSE
end

 

Rank por action.

Tag: <action itemid="id do item desejado" script="Rank.lua"/>

function onUse(cid,item,frompos,item2,topos)
--Action by Jovial
local nomes = {}
local level = {}

environment = assert(luasql.mysql())
--Criamos um ambiente de conexão
connection = assert(environment:connect('theforgottenserver', 'root', 'minha senha', 'localhost', 3306))
--Agora nos conectamos com o MySQL (não esqueça de colocar sua senha acima)
cursor = assert(connection:execute("SELECT `name`,`level` FROM `players` ORDER BY `level` DESC LIMIT `0`, `10`;"))
--Aqui peguei os valores 'name' e 'level' dos 10 players com maior level, agora tenho que passar esse valor para uma tabela para que eu possa usá-los

	--By Palmares
row = cursor:fetch ({}, "a")
--A variável 'row' virou uma tabela contendo os valores do primeiro player(o com level mais alto)
while row do
--Irá repetir enquanto existir valores em 'row'
	table.insert(nomes, row.name)
	--Irá adicionar o valor contido em 'row.name' que é o nome de um player na tabela nomes
	table.insert(level, row.level)
	--Irá adicionar o valor contido em 'row.level' que é o level de um player na tabela level
	row = cursor:fetch(row, "a")
	--Irá pegar os valores do próximo player
end
	--/By Palmares

connection:close()
--Fechando a conexão
environment:close()
--Fechando o ambiente de conexão

msg = tableToList(nomes,level)
--Função criada por mim para passar os valores coletados para uma lista
doPlayerPopupFYI(cid, msg)
--Irá abri uma janela para o player, que irá mostrar o rank

return TRUE
end

function tableToList(nomes,level)
--Function by Jovial
local tmp
local str = ''

for tmp = 1,#nomes do
	if (str == '') then
		str = nomes[tmp]..'['..level[tmp]..']'
	else
		str = str .. '\n'..nomes[tmp]..'['..level[tmp]..']'
	end
end
return str
end

Espero que vocês gostem! Qualquer dúvidas poste aqui.

Se achar algum erro no tutorial me avise, pois ele é bem grande e pode ter passado algo despercebido.

 

Abraço;

 

Jovial.

Editado por Jovial

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aprovado jovis...

xD...

bah me disculpa intrometer como voce é preguissoso e nao quer botar dai os noob vao se ###### vao chorar e vao para de programar porque não consegue ahesues :D.

 

Para fazer o query selecionar uma coluna ou tabela é usado ASSENTO ` NÂO AS ' << aspinha:

exemplo para notar:

("SELECT `rank_id` FROM `players` WHERE `name` = " .. p_name .. ";)

onde uma var é normal em todo lua.

:p

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jovial

@Palmares_

Legal ver vocês aqui.

 

Tomara que queiram fazer parte da familia XTibia

 

Ótimo tutorial

 

SUPER APROVADO

 

 

Ps.: Se tiverem contato com

[V]Dragonheart

PLX... peçam pra ele vir aqui no XTibia também

 

smile_bye.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom tutorial, eu até leria, se não soubesse, como já sei tudo disso, só me resta comentar. :p

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jovial(pelo tuto) e Nostradamus(por participar da xfusion)

No site criado pela exfusion projects ele se conecta a database "otserv"(axo que é essa).

Pelo que vi, ele só funciona em SQL, para usa-lo em SQLite como faço???

 

É só mudar o modo de conecção e etc??

E como coloco uma DB de SQLite pra rodar em server(com o que o site se conecta),

pelo que sei, ele não precisa de um servidor separado.

 

Já que estamos em uma era de readaptaçoes, eu axo que seria bem melhor

esquecer-mos o SQL e ficar apenas com SQLite, poi eh bem mais pratico ;)

 

Grato, KingCPI

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simplesmente formidável.

 

Tutorial com certeza aprovado e fixado ;D

 

Parabéns Jovial e palmares.

 

Está rating_5_mini.gif

 

 

Sem mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@KingCPI

Eu não troco o tradicional mysql pelo sqlite, acho o mysql muito bom e mais prático, posso fazer oque eu quiser de qualquer lugar do mundo =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Conteúdo Similar

    • Por OtsTibianos
      Furora.net 10.00-11.47 Global Real Map!
      Furora
      Registre-se para ver link(s).

      Registre-se para ver link(s).

      Registre-se para ver link(s).
      10.00-11.48 port 7171
      ip furora.net
      Exp Stages
      1-50: x 400
      50-100: x 300
      100-120: x 200
      120-140: x 100
      140-160: x 80
      160-180: x 60
      180-200: x 40
      200-220: x 30
      220-240: x 15
      240-260: x 10
      260-300: x 5
      300-400: x 3
      400-500: x 2
      500 +: x 1
      Skills: x 50
      Magic Level: x 10
      Loot: x 3
      Houses: 100 lvl +
      Protection level: 100 lvl +
      PZ Lock: 60 seconds
      White Skull Time: 5 minutes
      Frags to Red Skull: 10 (Day)
      Frags to Black Skull: 15 (Day)
      the first 20 mounts is free for all players!
      from 30 lvl at every next 30 lvl receive certain quantity crystal coins!
      Commands:
      !serverinfo = server information
      !frags = Display's your current frags count.
      !aol = Buy aol. Cost 20000 gp.
      !bless = Buy all bless with twist of fate! (to 200 lvl bless are free).
      !go = Change of outfit everyone in the guild
      House Commands:
      !buyhouse = If you stand near the house doors, this command will buy house, if you have enough money.
      !leavehouse = If you stand in your house, you will leave it. All items will go to the inbox.
      aleta sio = set house guest list.
      aleta som = set house subowners list.
      aleta grav = when you stand before the door, set access to a door.
      alana sio = kick player out of your house.
      Here are some screenshots from the server:






      No wait! go
      Registre-se para ver link(s).
      and Make account now!
    • Por Vills
      Olá pessoal, boa tarde. Eu tentarei não me alongar nesse tipo de tópico pois não há necessidade disso, o próprio título chamativo já aponta o intuito deste tópico per si só. Trata-se de uma pesquisa de opinião, agora que tenho bastante tempo livre irei voltar aos primórdios onde eu tento montar um servidor e acabo desanimando e fracassando (sádico, não é mesmo?), em geral grande parte do motivo é porque encontro pessoas com vontade, mas não para apoiar minhas ideias, assim como noventa porcento da comunidade também tem este mesmo problema. 
       
      Andei fazendo uma pesquisa de mercado utilizando listas que apontam servidores para players que os procuram, pude ver que há uma carência de servidores da versão 7.6, atualmente não há NENHUM servidor global (e saudosista diga-se de passagem) nesta versão que é aclamada por muitos como uma das melhores e que contém a essência do jogo em sua magnificência e originalidade, claro.
       
      A ideia é dividir pequenos objetivos e conquista-los com a ajuda da comunidade, não há nenhum interesse econômico neste futuro servidor, todo o conteúdo produzido para o servidor que sejam de autoria de terceiros (e quando digo isso estou querendo dizer qualquer um que não seja eu) deverão ser divulgados ou mesmo comercializados por seu autor, se assim o mesmo desejar. Não exigirei exclusividade, pontualidade, metas ou qualquer coisa da equipe, deixarei objetivos expostos tanto no tópico que está por vir quanto no CHAT que criarei futuramente. A ideia é dar autonomia para os membros e a própria comunidade ajudar no desenvolvimento, irei conceder honrarias dentro do futuro servidor para TODOS aqueles que ajudarem, isso inclui qualquer coisa durante um período de tempo permanente. (Quando digo comunidade são entusiastas que acompanharam o tópico, pessoas sem qualquer filiação com a equipe de desenvolvimento)
       
      Com tudo isso o meu objetivo é tentar uma nova abordagem ao criar um tópico de formação de equipes, diminuir a burocracia ao máximo possível e inovar um pouco. É dar autonomia para o projeto, permitindo que toda a comunidade possa ajudar no desenvolvimento sem que seja cobrado nada de ninguém.
       
      É claro, nada mais justo que liberar o servidor para público assim que concluído, no momento eu preciso de qualquer pessoa disposta a ajudar, qualquer habilidade é bem vinda, tirando spriters pois usaremos o conteúdo disponibilizado pelo próprio Tibia. Não tem importância o nível da habilidade desde que se tenha vontade de ajudar. Oh, céus, acabei me alongando mais do que deveria.
       
      Preciso de comentários neste tópico para ter uma noção de quantas pessoas apoiam, qualquer comentário ou crítica construtiva será bem recebido. Qual sua opinião sobre o narrado acima? Desde já deixo os meus agradecimentos para quem leu até agora, uma boa tarde novamente.
       
       
       
       
    • Por Frenvius
      Fala galera, disponibilizando aqui para vocês o Item Editor, versão mais atual.
       
      E dando introdução ao nosso repositório no github, que em breve terá outros projetos
       

       
      Créditos:
      - Mignari
       
      Contribuidores:
      - Daniel (Ícone da aplicação)
       
      Downloads:

      Registre-se para ver link(s).

      Registre-se para ver link(s).
       
       
    • Por Frenvius
      Fala galero, me deparei com um pessoal pedindo ajuda com isso e vi que não tinha tutorial aqui no fórum ainda, e já que muita gente ainda usa isso, ficadicae:
       
      Passo 1:
       
      Primeiramente, será necessário dois IPs direcionando para o ip do seu servidor, um com 17 caracteres e outro com 19.
       
      Tipo esses:
      ot1.servegame.com (17 caracteres) otserv.servegame.com (19 caracteres) Você pode utilizar o Registre-se para ver link(s).
       para isso
       
      Passo 2:
       
      Você precisará do Registre-se para ver link(s).
      , não tem ele instalado ainda? No problem, só clicar no link ai e baixar o/
      Depois que você baixar e instalar, abra o Tibia.exe que deseja editar com o Registre-se para ver link(s).
       e aperte Ctrl+F.
       
      Procure pelos IPs abaixo (um de cada vez):
      login01.tibia.com login02.tibia.com login03.tibia.com login04.tibia.com login05.tibia.com Substitua todos esses IPs do tibia pelo seu IP de 17 caracteres criado no passo 1.
       
      Feito isso, procure pelos IPs abaixo (novamente, um de cada vez ):
      tibia01.cipsoft.com tibia02.cipsoft.com tibia03.cipsoft.com tibia04.cipsoft.com tibia05.cipsoft.com Substitua todos esses IPs do tibia pelo seu IP de 19 caracteres criado no passo 1.
       
      Passo 3:
       
      Beleza, terminando de substituir os IPs, vai faltar só substituir a RSA key do Client
       
      Procure por:
      132127743205872284062295099082293384952776326496165507967876361843343953435544496682053323833394351797728954155097012103928360786959821132214473291575712138800495033169914814069637740318278150290733684032524174782740134357629699062987023311132821016569775488792221429527047321331896351555606801473202394175817 E substitua por:
      109120132967399429278860960508995541528237502902798129123468757937266291492576446330739696001110603907230888610072655818825358503429057592827629436413108566029093628212635953836686562675849720620786279431090218017681061521755056710823876476444260558147179707119674283982419152118103759076030616683978566631413  
      Pronto, salve o arquivo e teste
       
      Qualquer problema/duvidas, comentem!
    • Por anderkrox
      Em desenvolvimento... Closed Beta previsto para Fevereiro.
      Eternera Tibia Server - RPG
      O servidor que 84,20% dos Tibianos estão esperando há muito tempo, segundo nossas pesquisas!
       
       
      O Eternera Tibia Server é um servidor de Tibia que dá ao jogador a oportunidade de aventurar-se nas maravilhosas terras do nosso misterioso mundo de fantasia, cheio de magia, beleza e muito enredo.
      O jogador começa em uma ilha inicial com vários propósitos ditados pelos NPCs. Durante sua jornada ele deve trabalhar para conseguir dinheiro, comida, e equipamentos para sobreviver.
      Alguns jogadores preferem trabalhar como pescadores, outros como fazendeiros, há aqueles que preferem seguir o lado sombrio do jogo, assaltando NPCs, matando outros jogadores, e criando armadilhas.
      Todos tem a opção de sair da ilha inicial após certa experiência dentro do jogo, podendo então escolher uma classe, seja ela druida, feiticeiro, arqueiro, ou, por fim, guerreiro. Cada classe tem suas habilidades distintas, e para adquirí-las deverá estudar com NPCs especialistas em habilidades, pagando uma quantia em moedas de ouro.
      A beleza do Eternera Tibia Server é porque ele está sendo desenvolvido por pessoas que vivenciaram o RPG da versão antiga de Tibia, fazendo os jogadores interagirem com as aventuras, se esforçarem para conseguir dinheiro, equipamentos, pontos de experiência, e desvendar incontáveis mistérios.
       
      Algumas informações úteis do Eternera Tibia Server