[RPG-MAKER.FR] Oniromancie: tout l'univers de RPG Maker en français - Scripts - Support Mysql

Oniromancie: Scripts - Support Mysql


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace

Apprendre
RPG Maker

Guides
Tutoriels
Astuces
Making-of


Comment ça marche?

Aëdemphia
Par Sylvanor

Fighting Robots Quest
Par Boulon

Geex
Par roys

Inexistence
Par Falco

La Légende d'Ibabou
Par Zaitan

Nylu
Par NanakyTim

Sarcia
Par Kaëlar

Super Mario RPG - Lost Souls
Par Omegabowser

News: Game design: ouvrir son jeu aux (...) / News: Des jeux et des screens / News: Alex 2019 : tests et nominations (...) / Jeux: Wendy Whedon / Sorties: Wendy Whedon /

Chat  

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

139 connectés actuellement

10211301 visiteurs
depuis l'ouverture

99 visiteurs
aujourd'hui

Groupe Facebook

Barre de séparation

Partenaires






TOP
GAMEMAKING


Les 5 plus
visités

Akademiya RPG Maker

Alex d'Or

Blog of Chaos17

BloGecko

ConsoleFun

Au hasard

Blog of Chaos17

Indiexpo

RPG Maker Détente

Les deux derniers

Zarok

Akademiya RPG Maker

Nos autres partenaires

Devenir
partenaire


Barre de séparation

Un site du réseau
War Paradise

Annuaires référenceurs




Support Mysql
Script pour RPG Maker VX
Ecrit par berka

Bonjour à tous.

Certains me l'avaient demandé. Le voici enfin.
Ceux qui s'y connaissent auront directement compris l'utilité de ce script par le titre de ce sujet. Pour les autres, ce script permet d'établir une connexion à une base de donnée de type mysql directement depuis rpgmaker.
Vous allez pouvoir envoyer et recevoir des informations dans votre jeu et cela beaucoup plus rapidement que par des transferts de fichiers classiques.

Mais tout d'abord il faut savoir que ce script ne fonctionne pas pour tous les types d'hébergement mysql. Seuls les hébergements (payants) offrant une connexion SSH (connexion depuis un programme externe au serveur web) peuvent faire fonctionner ce script. Vous pouvez toutefois tester en local, via des logiciels comme wamp.
Sachez enfin qu'en cas de décryptage de votre jeu, les identifiants mysql seront lisibles en clair. Ne mettez aucunes données personnelles sur votre serveur. Mais là, ce n'est plus mon problème.
Ce script a besoin d'une dll pour fonctionner. La voici:
Libmysql.dll

Voila le script à copier au dessus de main.
Vous avez des réglages à faire au début du script. Lisez bien tout. Enfin, je voudrais que vous me demandiez la permission avant de poster ce script sur un autre forum.


Portion de code:



#======================================================================

# Net::Mysql
# 22-05-2010 www.rpgmakervx-fr.com Rgss2 v0.1
# par berka
#--------------------------------------------------------------------------------------------------------------------------
# Ce script est libre d'utilisation. Ne pas poster sans accord de l'auteur. Crédits requis.
#--------------------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
#
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# ● fonctions Mysql :
# - Net::Mysql.connect : return : mysql connection handle
# - Net::Mysql.close : return : bool
# - Net::Mysql.query("query") : return : query result handle
# - Net::Mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - Net::Mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - Net::Mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - Net::Mysql.list_tables([filtre]) : return : ["table1", "table2"]
#
# ● fonctions Html:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self
# - "".htmlspecialchars : return : "&lr;berka>"
# - "".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : ""
#--------------------------------------------------------------------------------------------------------------------------
# Exemples de requetes SQL
# ● "SELECT * FROM `table`"
# ● "INSERT INTO `table` (champs) VALUES (valeurs)"
# ● "INSERT INTO `table` SET champ = valeur WHERE champ = valeur"
# ● "UPDATE `table` SET champ = valeur WHERE champ = valeur"
#--------------------------------------------------------------------------------------------------------------------------
# Exemple d'utilisation:
# Net::Mysql.connect
# Net::Mysql.query("SELECT * FROM `membres`)
# res = Net::Mysql.fetch_assoc
# => {"id"=>["1","2"], "nom"=>["berka","rgss"], "age"=>["19",""]}
#======================================================================

module Berka
module Mysql
Host ="127.0.0.1" # serveur mysql (local : 127.0.01)
User ="root" # utilisateur mysql
Pass ="" # mot de passe mysql
Base ="test" # nom de la base
Port =3306 # port du serveur (par défaut: 3306)

Err_Con = "Mysql:\nImpossible de se connecter à la base"
Err_Req = "Mysql:\nLa requete n'a pu être envoyée."
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end

class Numeric
def copymem(len)
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end

class String
include Berka::Html

def to_ruby
eval(self) rescue self
end

def htmlspecialchars
{"&"=>"&",'"'=>""","'"=>"'","<"=>"&lr;",">"=>">"}.each_pair{|k,v|self.gsub!(k,v)}
self
end

def urlencode
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Spec_Char.include?(c);o< end

def urldecode
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end

module Net
module Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MC=Win32API.new("libmysql.dll","mysql_close","","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFF=Win32API.new("libmysql.dll","mysql_fetch_field","p","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")

module_function
include Berka::Mysql

def connect
@my=MI.call(0)
(print(Err_Con)) if MRC.call(@my,Host,User,Pass,Base,Port,nil,0)==0
@my
end

def close
MC.call(@my)
end

def list_tables(m="")
l=MFR.call(MLT.call(@my,m)).copymem(1024)
l.scan(/\t(\w+)\0/).flatten
end

def query(req)
(return print(Err_Req))if !MQ.call(@my,req)
MFRE.call(@result)if @result
@result=MSR.call(@my)
end

def get_fields(res=nil)
r=res.nil? ? @result : res
nf,ch=MFC.call(@my),[]
nf.times{|i|ch< ch
end

def get_rows(res=nil)
r=res.nil? ? @result : res
nr,nf,en=MNR.call(r),MNF.call(r),[]
return nil if nf==0||nr==0
nr.times{|i|
c=MFR.call(r).copymem(4).unpack("i")[0]
tf=MFL.call(r).copymem(4*nf).unpack("i*")
sf=tf.inject(0){|n,i|n+i}
en< }
en
end

def fetch_assoc
h,f,r={},get_fields,get_rows
f.each_with_index{|fi,i|t=[];r.each{|l|t<};h[fi]=t}
h
end
end
end



berka


berka - posté le 23/05/2010 à 17:26:40. (493 messages postés)

planchant sur un script

Il manque une partie du script: le voici en entier:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#======================================================================
#                                                                    Net::Mysql
#      22-05-2010                            www.rpgmakervx-fr.com                                    Rgss2  v0.1
#                                                                    par berka                  
#--------------------------------------------------------------------------------------------------------------
# Ce script est libre d'utilisation. Ne pas poster sans accord de l'auteur. Crédits requis.
#--------------------------------------------------------------------------------------------------------------
#  Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
#  Ne pas utiliser de base de donnée contenant des informations personnelles.
#  
#  Votre hébergeur Mysql doit accepter les connexions mysql externes.
#  Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
# # ATTENTION ! Il faut enlever les * avant l'utilisation dans la def htmlspecialchars. 
#Le forum convertit automatiquement les caractères. 
#--------------------------------------------------------------------------------------------------------------
# ● fonctions Mysql :
#  - Net::Mysql.connect : return : mysql connection handle 
#  - Net::Mysql.close : return : bool
#  - Net::Mysql.query("query") : return : query result handle
#  - Net::Mysql.get_fields([handle result]) : return : ["field1", "field2"]
#  - Net::Mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
#  - Net::Mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
#  - Net::Mysql.list_tables([filtre]) : return : ["table1", "table2"]
#
# ● fonctions Html:
#  - "string".to_ruby : return : true, false, nil, Integer, Float, self
#  - "<berka>".htmlspecialchars : return : "&lr;berka>"
#  - "<berka>".urlencode : return : "%3Cberka%3E"
#  - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------
# Exemples de requetes SQL
# ●  "SELECT * FROM `table`"
# ●  "INSERT INTO `table` (champs) VALUES (valeurs)"
# ●  "INSERT INTO `table` SET champ = valeur WHERE champ = valeur"
# ●  "UPDATE `table` SET champ = valeur WHERE champ = valeur"
#--------------------------------------------------------------------------------------------------------------
# Exemple d'utilisation:
# Net::Mysql.connect
# Net::Mysql.query("SELECT * FROM `membres`)
# res = Net::Mysql.fetch_assoc
# => {"id"=>["1","2"], "nom"=>["berka","rgss"], "age"=>["19",""]}
#======================================================================
 
module Berka
  module Mysql
    Host    ="127.0.0.1"                            # serveur mysql (local : 127.0.01)
    User  ="root"                                      # utilisateur mysql
    Pass  =""                                            # mot de passe mysql
    Base  ="test"                                      # nom de la base
    Port    =3306                                      # port du serveur (par défaut: 3306)
    
    Err_Con = "Mysql:\nImpossible de se connecter à la base"
    Err_Req = "Mysql:\nLa requete n'a pu être envoyée."
  end
  module Html
    Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  end
end
 
class Numeric
  def copymem(len)
    Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
  end
end
 
class String
  include Berka::Html
  
  def to_ruby
    eval(self) rescue self
  end
  
# ATTENTION ! Il faut enlever les * avant l'utilisation. Le forum convertit automatiquement les caractères. 
  def htmlspecialchars
    {"&"=>"&*#38;",'"'=>"&*#34;","'"=>"&*#39;","<"=>"&*#60;",">"=>"&*#62;"}.each_pair{|k,v|self.gsub!(k,v)}
    self
  end
    
  def urlencode
    o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Spec_Char.include?(c);o<<c};o
  end
    
  def urldecode
    self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  end
end
  
module Net
  module Mysql
    MI=Win32API.new("libmysql.dll","mysql_init","l","l")
    MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
    MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
    MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
    MC=Win32API.new("libmysql.dll","mysql_close","","l")
    MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
    MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
    MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
    MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
    MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
    MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
    MFF=Win32API.new("libmysql.dll","mysql_fetch_field","p","l")
    MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
    MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
    
    module_function
    include Berka::Mysql
    
    def connect 
      @my=MI.call(0)
      (print(Err_Con)) if MRC.call(@my,Host,User,Pass,Base,Port,nil,0)==0
      @my
    end
    
    def close
      MC.call(@my)
    end
    
    def list_tables(m="")
      l=MFR.call(MLT.call(@my,m)).copymem(1024)
      l.scan(/\t(\w+)\0/).flatten
    end
    
    def query(req) 
      (return print(Err_Req))if !MQ.call(@my,req)
      MFRE.call(@result)if @result
      @result=MSR.call(@my)
    end
    
    def get_fields(res=nil) 
      r=res.nil? ? @result : res
      nf,ch=MFC.call(@my),[]
      nf.times{|i|ch<<MFFD.call(r,i).copymem(256).unpack("iissi")[0].copymem(8).delete!("\0")}
      ch
    end
    
    def get_rows(res=nil)
      r=res.nil? ? @result : res
      nr,nf,en=MNR.call(r),MNF.call(r),[]
      return nil if nf==0||nr==0
      nr.times{|i|
      c=MFR.call(r).copymem(4).unpack("i")[0]
      tf=MFL.call(r).copymem(4*nf).unpack("i*")
      sf=tf.inject(0){|n,i|n+i} 
      en<<c.copymem(sf+nf).split("\0")
      }
      en
    end
    
    def fetch_assoc
      h,f,r={},get_fields,get_rows
      f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi]=t}
      h
    end
  end
end
 

Twitter: Pensées politiques et juridiques. Réflexions informatiques


nuparu1997 - posté le 23/05/2010 à 17:36:17. (222 messages postés)

Cool. Ca à l'air pratique. ca va aider des gens !


Tata-Monos - posté le 23/05/2010 à 17:56:34. (56891 messages postés) - misteroniro

Vive le making libre

Très très dangereux ce script dans un projet Rm distribuable.
Mais berka le dit lui même.

Distribuez vos productions dans un cercle fermer et de confiance.
Personnellement c'est le gros conseille que je donne.

Car si une personne décrypte, et si c'est une personne malintentionné, vous pouvez dire adieux à vos base de donnée et très certainement à tous ce qui se trouve sur le FTP :D

Pixner|Offgame | Le comptoire des clikeurs


berka - posté le 23/05/2010 à 18:07:41. (493 messages postés)

planchant sur un script

oui, merci de préciser cela.
Il est évident que la protection de votre jeu est complètement naze. Il est possible d'extraire tous les scripts de votre jeu en une seule commande, très facilement.
Après, il faut être logique: ne pas utiliser de base de données personnelle. Votre base, voire votre serveur ne doit contenir que des données de jeu. Rien d'autre. Faites attention à ce que vous mettez dans votre base.
Théoriquement, les serveurs ftp et mysql sont indépendants, mais la plupart des hébergeurs web utilisent les memes identifiants de connexion.

Nouvelle idée de script... Un algorithme de cryptage plus sécurisé pour RM...

Edit: Vous avez des idées de fonctions mysql non présentes dans le script ? J'ai épluché la doc mais aucune autre fonction ne m'a semblé utile.

Twitter: Pensées politiques et juridiques. Réflexions informatiques


Tata-Monos - posté le 23/05/2010 à 19:11:40. (56891 messages postés) - misteroniro

Vive le making libre

Citation:

les serveurs ftp et mysql sont indépendants


Le problème ne vient pas non plus que les serveur et la base de donnée sont indépendants pour pirater "un site web"
Il faut aussi sécuriser le site web.
Bon après a la question, si on peut effacer un FTP directement dans mysql. je ne sais pas. Je ne suis pas spécialiste du piratage même si en ce moment je suis sur de la protection internet. Mais bon.
Je crois qu'on peu upper des trucs via mysql.

Des personnes plus compétentes comme nonor pourra en dire plus.

Citation:

Edit: Vous avez des idées de fonctions mysql non présentes dans le script ? J'ai épluché la doc mais aucune autre fonction ne m'a semblé utile.


Upade, insert to, Delete,
C'est les trois commandes que j'utilise le plus.

Après il y a les sous fonctions ORDER BY, LIMIT, DESC
Mais après tout va dépendre de ce que tu fais faire.
Il y a aussi la fonction compter. Count je crois.

Mais à chaque fois j'ai besoin d'un mémento quand je programme.
Donc la en live, j'ai du mal.

Pixner|Offgame | Le comptoire des clikeurs


nuki - posté le 23/05/2010 à 21:27:06. (1389 messages postés)

Balaise le script Berka !

Update insert into delete, c'est pas vraiment des fonctions tout comme order by, limit, desc ne sont pas de sous fonctions... En plus monos, comme tu peux faire une requete, tu peux mettre ce que tu veux :S

Pour le ruby je ne sais pas si mysql_real_escape_string, pour l'enregistrement. Sinon y'a tout ce qu'il faut. Bon boulot !

Luttez contre lui !


berka - posté le 23/05/2010 à 21:30:47. (493 messages postés)

planchant sur un script

Non monos, les fonctions de requetes (SELECT, UPDATE, INSERT) sont parfaitement gérées.
Ce que je voulais c'était des fonctions de l'API mysql.

Edit: ok Nuki: je vois ca
Re-edit: Je viens de voir que le forum convertit automatiquement les caractères html. Dans le script, à la def htmlspecialchars, il faut que vous enleviez les * avant d'utiliser le script.

Twitter: Pensées politiques et juridiques. Réflexions informatiques


Jess 007 - posté le 24/05/2010 à 12:29:56. (771 messages postés)

Ralf, déterminé.

Ouais trop cool j'vais pouvoir envoyer mon jeu au coupe gorge ! ! ! !

Non par contre (mis à part la sécurité, mais ça tu n'y peut rien...) c'est vraiment énorme je trouve. J'y connais rien aux scripts (du moins je sais traduire par exemple :F ), donc là tu me plombe. X)

J'suis sur que tu pourrais faire de VX un moteur de MMORPG super facilement Berka... (ou alors c'est déjà fais et je le sais pas :doute3 )

Bon boulot comme d'hab ! :p

SITE de Kipatord - Kipatord - Le Mal s'emballe (demo)


Zeus81 - posté le 27/05/2010 à 20:24:55. (11071 messages postés)

Bon script, mais t'aurais pu faire mieux. :F

Déjà t'aurais pu faire une classe :

Portion de code : Tout sélectionner

1
2
3
4
5
class Mysql
  def initialize(host, user, pass, port=3306, db="") ... end
  def close ... end
  ...
end

Comme ça on pourrait se connecter à plusieurs serveurs en même temps.
T'aurais pu faire que la méthode query retourne directement un tableau tant qu'à faire.
Et ton fetch est inversé, je m'explique :

Spoiler (cliquez pour afficher)



Côté bug j'ai l'impression que list_table ne marche pas (et n'est pas très utile).
Ah oui et :

Portion de code : Tout sélectionner

1
2
3
4
MC=Win32API.new("libmysql.dll","mysql_close","","l")
def close
  MC.call(@my)
end

Le nombre d'arguments est différent.


J'ai pas compris l'intérêt de ta fonction to_ruby, qu'est ce qu'elle vient faire dans ce script ?

Sinon dans les fonctions que tu pourrais rajouter y'a aussi mysql_select_db.

Par contre pourquoi tu dis que c'est un script VX, ça marche très bien sur XP aussi...

Spoiler (cliquez pour afficher)


berka - posté le 29/05/2010 à 03:22:37. (493 messages postés)

planchant sur un script

Pour le fetch, je me suis inspiré de la doc PHP, mais je vas revérifier demain. J'ai peut etre mal lu.
Pour close, j'ai vu cela, j'ai réglé le tout dans une nouvelle version.
Il ne fonctionne pas pour XP, parce que XP ne reconnait pas les inclusions de modules.
Pour les mysql_select_db, je vais la rajouter.
Pour to_ruby, cela permet de converter les chaines renvoyées par get_rows en objets ruby. Plus pratique.
List_tables chez moi fonctionne.
Quand à la classe Mysql, pourquoi pas.

Merci du rapport

EDIT:

Nouvelle version:
C'est en angliche, mais c'est plus pratique vu que je le poste à plusieurs endroits différents.

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#======================================================================
#                                                                    Net::Mysql
#       29-05-2010                             www.rpgmakervx-fr.com                                    Rgss1&2  v.1
#                                                                     par berka                   
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles ! 
#  Ne pas utiliser de base de donnée contenant des informations personnelles. 
#  Votre hébergeur Mysql doit accepter les connexions mysql externes. 
#  Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données. 
#-------------------------------------------------------------------------------------------------------------------------- 
# Ce script permet d'interragir avec une base de données mysql directement via le jeu. 
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu. 
#-------------------------------------------------------------------------------------------------------------------------- 
# ● md5() support
# ● Mysql functions:
#   - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle 
#   - @mysql.close : return : bool
#   - @mysql.list_tables([filter]) : return : ["table1", "table2"]
#   - @mysql.select_db(base_name) : return : true if the db exists or false
#   - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
#   - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
#   - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
#   - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
#   - @mysql.num_rows([handle result]) : return : integer
# ● Html functions:
#   - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
#   - "<berka>".htmlspecialchars : return : "&lr;berka>"
#   - "<berka>".urlencode : return : "%3Cberka%3E"
#   - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# ●  "SELECT * FROM table"
# ●  "INSERT INTO table (fields) VALUES (values)"
# ●  "INSERT INTO table SET field = value WHERE field = value"
# ●  "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================
 
module Berka
  module Mysql
    Host   = "127.0.0.1"                          # mysql server(local : 127.0.0.1)
    User   = ""                                           # mysql user
    Pass  = ""                                           # mysql password
    Base  = "rgss"                                   # base name
    Port    = 3306                                     # server port (default: 3306)
    
    Err_Con = "Mysql:\nUnable to connect to the database"
    Err_Req = "Mysql:\nUnable to send the query"
  end
  
  module Html
    Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  end
end
 
class Numeric
  RMM=Win32API.new("kernel32", "RtlMoveMemory", "ppl", "")
  def copymem(len)
    # move memory to convert c structs to ruby objects
    RMM.call(buf="\0"*len,self,len);buf
  end
end
 
class String
  
  def to_ruby
    # detect if the string is a md5 hash
    return self if self=~/^[a-f0-9]{32}$/
    # converts syntax of a string to ruby controls
    eval(self)rescue self
  end
  
  def htmlspecialchars
    # converts special chars to html compatibles chars (ASCII)
    {"&"=>"&",'"'=>""","'"=>"'","<"=>"&lr;",">"=>">"}.each_pair{|k,v|self.gsub!(k,v)}
    self
  end
    
  def urlencode
    # converts special char of url 
    o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o<<c};o
  end
    
  def urldecode
    # converts encoded special char of url to normal chars
    self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  end
end
  
module Net
  class Mysql
    MI=Win32API.new("libmysql.dll","mysql_init","l","l")
    MC=Win32API.new("libmysql.dll","mysql_close","l","l")
    MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
    MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
    MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
    MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
    MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
    MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
    MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
    MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
    MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
    MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
    MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
    MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
    
    attr_reader :handle
    
    def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
      # @handle : handle of mysql initialization
      @handle=MI.call(0)
      # establishes the mysql connection
      (print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
      # returns: handle
      @handle
    end
    
    def close
      # closes the current connection
      MC.call(@handle)
    end
    
    def select_db(base)
      # selects a current database
      MSDB.call(base)==true
    end
    
    def list_tables(m="")
      # lists tables request -> fetch the result -> to ruby string
      l=MFR.call(MLT.call(@my,m)).copymem(1024)
      # splits the string to array -> list of tables
      l.scan(/\t(\w+)\0/).flatten
    end
    
    def query(req,ret=false)
      # sends the query (msg error)
      (return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
      # previous results are released
      MFRE.call(@result)if @result
      # gets the results from the query -> c struct handle
      @result=MSR.call(@handle)
      ret ? get_rows(@result) : @result
    end
    
    # Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
    # returns the fieldname or nil if the field is not found. 
    ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
    
    def get_fields(res=nil) 
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # gets the number of fields, offset: 8bytes-2 (cf. loop)
      nf,ch,of=MFC.call(@handle),[],6
      # each field: if the fieldname is not found: increase the offset of bytes.
      nf.times{|i|a=ReadField.call(r,i,of+=2)until a
        # add to the fields array
        ch<<a
        # reinitialize the offset for the next iteration
        of=6}
      # returns an array of fields
      ch
    end
    
    def get_rows(res=nil)
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # nr: number of rows, nf: number of fields
      nr,nf,en=MNR.call(r),MNF.call(r),[]
      # each row:
      nr.times{|i|
       # gets each row: c struct -> to ruby string -> to array (handles)
       c=MFR.call(r).copymem(4).unpack("i")[0]
       # gets each field length: c struct -> to ruby string -> to array (handles)
       tf=MFL.call(r).copymem(4*nf).unpack("i*")
       # size of field: offset of each field
       sf=tf.inject(0){|n,i|n+i} 
       # handle of row -> to string (offset) -> to array 
       en<<c.copymem(sf+nf).split("\0")
       }
       # returns each row as an array
      en
    end
    
    def num_rows(res=nil)
      # if a result handle is provided 
      r=res.nil? ? @result : res
      # returns: number of rows
      MNR.call(r)
    end
    
    def fetch_assoc(to_ruby=false)
      # gets rows and fields
      h,f,r={},get_fields,get_rows
      # each field: read the rows and store them to an hash : h[:field]=[rows]
      # rows are converted to ruby objects if to_ruby == true
      f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
      h
    end
  end
end

Twitter: Pensées politiques et juridiques. Réflexions informatiques


RPG-Man - posté le 20/06/2010 à 17:29:45. (812 messages postés)

Rubyste, C#iste, 17 ans, over-booké.

Dès que j'ai vu le titre je me suis dis que c'était obligatoirement berka qui avait fait ce script, c'est bourré d'APIs :)

C'est vrai que ça peut être pas mal pour des jeux avec du scoring online. Sauf que sur RM j'en ai pas vu beaucoup :p

Citation:

class Numeric
def copymem(len)
# move memory to convert c structs to ruby objects
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end



Et là pourquoi est-ce que tu déclares pas l'API en constante au lieu de recréer une instance de l'API à chaque utilisation ? ^^

Je savais pas qu'on pouvait utiliser des APIs bas niveau comme ça sous ruby ; c'est classe ça :D

En tout cas beau boulot !!

Blog de l'Usine en Folie| Vous l'attendez tous impatiemment ! | Geex


berka - posté le 07/07/2010 à 00:53:58. (493 messages postés)

planchant sur un script

Je ne sais pas, un sorte de flemme.
C'est vrai que c'est extrêmement gourmand.

On peut utiliser les Apis comme cela, d'ailleurs je suis tombé récemment et par hasard sur de droles de choses dans la ram... des trucs vraiment bizarres et pas du tout protégées.

Là je suis en train de me créer un petit orpg via apis. Ca rame un peu, mais c'est optimisable... c'est vraiment très cool à coder en tout cas.

J'hésite à me compiler une dll avec un binding ruby. Ce sera indubitablement plus rapide, mais beaucoup moins fun niveau code ruby. Exit tous les accès Ram...

Twitter: Pensées politiques et juridiques. Réflexions informatiques


tuturxxx - posté le 05/12/2010 à 14:50:21. (6 messages postés)

Pouvez vous mettre une image please.:biere:noel:cig:bob:ange


lesiteduhtml - posté le 21/09/2012 à 20:28:12. (4 messages postés)

Salut à tous ^^,
C'était pour demander si quelqu'un pouvais m'envoyer la dll car elle ne marche plus.
Amicalement ^^
Jérôme

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site:

Communauté: Accueil | News | Forum | Flash-news | Sorties | Chat | Commentaires | Galerie | Blogs | Articles perso | Screen de la semaine | Palmarès | Livre d'or | Recherche | Interviews | OST | L'Annuaire | Divers
Apprendre: Le Wiki | Tutoriels | Guides | Gaming-Live | Tests | Making-of
Télécharger: Programmes | Scripts | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Index jeux séparés | Top Classiques | Top Originaux | Les autres | Collection Oniro | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Jeux complets | Proposer
Hébergés: Aëdemphia | Fighting Robots Quest | Geex | Inexistence | La Légende d'Ibabou | Nylu | Sarcia | Super Mario RPG - Lost Souls
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis