Advertisement
DaxSoft

Plugin

Aug 7th, 2015
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 13.48 KB | None | 0 0
  1. #==============================================================================
  2. # • Plugin
  3. #==============================================================================
  4. # Autor: Dax
  5. # Créditos: Masked : Me basei no script Auto Patch dele, para verificar a versão
  6. # do arquivo.
  7. # Versão: 1.0 &alpha
  8. # Site: www.dax-soft.weebly.com
  9. # Requerimento: Dax Core
  10. #==============================================================================
  11. # • Descrição:
  12. #------------------------------------------------------------------------------
  13. #   Este script permite que você adicione 'plugins' em seu jogo. Podendo-o
  14. # atualizar o mesmo, diretamente do jogo. Sem precisar baixa-lo ou instala-lo,
  15. # já que o script fornece essas duas opções de maneira automática.
  16. #==============================================================================
  17. # • Como usar:
  18. #------------------------------------------------------------------------------
  19. # • Para adicionar um Plugin, você deve registrá-lo. Veja abaixo como fazer
  20. # e um exemplo. Se tiver aprendido, e não tiver necessidade do tutorial.
  21. # Recomendo apagar o tutorial e o exemplo xD.
  22. =begin
  23. ** Para registrar é muito simples. Você chama o método register do Plugin,
  24. e defini nele, dentro de uma hash {} as informações.
  25. Plugin.register({
  26.         Você deve de definir o nome de registro do plugin.
  27.         name:             :nome_de_registro, # Deste modo.
  28.         Você deve de definir o autor do plugin.
  29.         author:           "Autor", # Desta maneira.
  30.         Você deve de definir a versão do plugin. Para fazer baixar, caso não tenha o
  31.         mesmo, basta por a versão 0.0.
  32.         version:          1.0,
  33.         Você deve de definir o link do plugin, onde o mesmo será baixado.
  34.   link:             "url do link"
  35. })
  36. ** Agora, no LINK em que você definir, deve conter o seguinte.
  37. version
  38. link<>filename<>path
  39.  
  40.   * version : A versão do plugin. Defina uma, caso você tem uma nova versão para
  41.   o mesmo, vá no link e o edite. Mude para a mais recente versão.
  42.   * link : URL do Link que será baixado.
  43.   * filename : Nome do arquivo do destino.
  44.   * path : É opcional, caso não queira, não precisa definir esta parte. Aqui você
  45.   define a pasta para qual o arquivo irá. Lembre-se, a pasta vai estar dentro
  46.   da pasta Data/Plugins
  47.  
  48. ** Utilize o préfixo. [ROOTPATH] para definir que será somente esse arquivo
  49. a ser lido.
  50.  
  51. Exemplo:
  52. www.link.com/file.ext<>file.ext<>Test
  53. ou
  54. [ROOTPATH]www.link.com/file.ext<>file.ext<>Test
  55.  
  56. ** Definindo uma imagem para ser baixado.
  57.  Você vai seguir o mesmo esquema do de cima, porém você só irá incluir o
  58.  pré-fixo [PICTURE] : Veja abaixo.
  59.  
  60. [PICTURE]www.link.com/file.ext<>file.ext<>Test
  61.   No caso de definir que é imagem. O arquivo será enviado para a pasta Graphics.
  62. Então a pasta será definida como Graphics.
  63.  
  64. ** Definindo um áudio para ser baixado. Segue-se o mesmo esquema que definir
  65. uma imagem. Você deve por o préfixo [AUDIO], e o arquivo será enviado para a
  66. pasta Audio. Aí você definide no [path] se será BGM/BGS/ME/SE veja abaixo um exemplo
  67. [AUDIO]www.link.com/audio.mp3<>audio.mp3<>BGM
  68.  
  69. ** Definindo um arquivo para a pasta System. DLL etc. O mesmo esquema que os
  70. demais. Você deve por o préfixo [SYSTEM], e o arquivo será enviado para a
  71. pasta System.
  72. [SYSTEM]www.link.com/test.dll<>test.dll
  73.  
  74. ** Definindo um vídeo para ser baixado. Préfixo [MOVIE], o arquivo será enviado
  75. para a pasta Movies
  76. [MOVIE]www.link.com/movie.wma<>movie.wma
  77.  
  78. ** Definido um arquivo para a pasta do projeto. Préfixo [PROJECT], o arquivo
  79. será enviado para a pasta do projeto.
  80. [PROJECT]www.link.com/readme.txt<>readme.txt
  81.  
  82. *** Veja abaixo um exemplo.
  83. Plugin.register({
  84.   name:         :hello_world,
  85.   author:       "dax",
  86.   version:      0.0,
  87.   link:         "http://pastebin.com/raw.php?i=iAkNjUm1"
  88. })
  89.  
  90.  No LINK do registro acima. Eu defini dá seguinte maneira. Se você abri-lo, estará
  91. assim.
  92.         1.2
  93.         http://pastebin.com/download.php?i=B1geBDHK<>hello_word.rb
  94.  ** Podemos ver a versão. 1.1. Ou seja, como registramos com a versão 0.0. O
  95.  Plugin será baixado e o registro será atualizado com a nova versão.
  96.  ** Podemos ver o link do o que será baixado. E logo após o mesmo, podemos ver
  97.  o nome do arquivo de destino.
  98.  
  99. =end
  100. #==============================================================================
  101. # • Versões:
  102. #------------------------------------------------------------------------------
  103. # 0.1 : &alpha
  104. #   - Método de registro, do script.
  105. #   - Método para carregar e executar arquivos.
  106. #   - Método para baixar arquivos.
  107. # 0.5 : &beta
  108. #   - Método para baixar arquivos e envia-los para pastas diferentes.
  109. #   - Salvar registro.
  110. # 1.0 :
  111. #   - Primeira versão completa.
  112. #==============================================================================
  113. Dax.register(:plugin, "dax", 1.0) {
  114. #==============================================================================
  115. # • Plugin
  116. #==============================================================================
  117. module Plugin
  118.   #----------------------------------------------------------------------------
  119.   # • Extender & Incluir
  120.   #----------------------------------------------------------------------------
  121.   include API
  122.   extend self
  123.   #----------------------------------------------------------------------------
  124.   # • Constantes
  125.   #----------------------------------------------------------------------------
  126.   MESSAGE_ZERO = "Você deseja baixar o plugin: <%s>, do autor: <%s>, versão: <%03s>"
  127.  MESSAGE_NOZERO = "Uma nova atualização está disponível, do plugin: <%s>, do autor: <%s>, versão: <%03s>\n Você deseja baixá-la?"
  128.  FORMAT = MessageBox::ICONINFORMATION|MessageBox::YESNO
  129.  #----------------------------------------------------------------------------
  130.  # • Variáveis.
  131.  #----------------------------------------------------------------------------
  132.  @@register = {}
  133.  @@download = {}
  134.  @@root_path = {}
  135.  @check_exit = false
  136.  #----------------------------------------------------------------------------
  137.  # • Executar
  138.  #----------------------------------------------------------------------------
  139.  def run()
  140.    self.check
  141.    return unless @check_exit
  142.    msgbox("<Atualização> : O jogo será fechado para conclusão.")
  143.    exit
  144.  end
  145.  #----------------------------------------------------------------------------
  146.  # • Registrar plugin.
  147.  #----------------------------------------------------------------------------
  148.  def register(hash)
  149.    error_(hash)
  150.    return if registred?(hash[:name], hash[:author], hash[:version])
  151.    @@register[[hash[:name], hash[:author]]] = hash
  152.    @@root_path[[hash[:name], hash[:author]]] = []
  153.    @@download[[hash[:name], hash[:author]]] = []
  154.  end
  155.  #----------------------------------------------------------------------------
  156.  # • Verificar se já está registrado.
  157.  #----------------------------------------------------------------------------
  158.  def registred?(key, author, version=nil, compare=:>=)
  159.    if @@register.has_key?([name, author])
  160.      return true if version.nil?
  161.      return !(@@register[[name, author]].get(:version) { |_version| version.method(compare).call(_version) } ).nil?
  162.    else
  163.      return false
  164.    end
  165.  end
  166.  #----------------------------------------------------------------------------
  167.  # • Obter informações.
  168.  #----------------------------------------------------------------------------
  169.  def info(key, author, version=nil)
  170.    return if registred?(key, author, version)
  171.    @@register[[key, author]]
  172.  end
  173.  #----------------------------------------------------------------------------
  174.  # • Carrega tudo.
  175.  #----------------------------------------------------------------------------
  176.  def load_all
  177.    load_register if FileTest.exist?("#{Dir.pwd}/Data/register.rvdata2") && !$TEST
  178.     @@root_path.each_value { |value|
  179.       if value.is_a?(String)
  180.         load_script(value.strip) rescue next
  181.       elsif value.is_a?(Array)
  182.         value.each { |path| load_script(path) rescue next } rescue next
  183.       end
  184.     }
  185.   end
  186. protected
  187.   #----------------------------------------------------------------------------
  188.   # • Checar se é necessário atualizar.
  189.   #----------------------------------------------------------------------------
  190.   def check
  191.     return unless $TEST
  192.     return puts("Sem conexão com à internet.") unless Network.connected?
  193.     load_register if FileTest.exist?("#{Dir.pwd}/Data/register.rvdata2")
  194.     @@register.each_pair { |key, value|
  195.       temp = "#{Dir.pwd}/temp.tmp"
  196.       Network.link_download(value.get(:link), temp)
  197.       File.open(temp, "rb") { |file| @@download[[*key]] = file.read.split(/\n/) }
  198.       version = @@download[[*key]].shift.to_f
  199.       if value.get(:version) == 0.0
  200.         _msg = sprintf(MESSAGE_ZERO, value.get(:name), value.get(:author), version)
  201.         hresult = MessageBox.call("Plugin Message", _msg, FORMAT)
  202.       elsif version > value.get(:version)
  203.         @@root_path[[*key]].clear
  204.         _msg = sprintf(MESSAGE_NOZERO, value.get(:name), value.get(:author), version)
  205.         hresult = MessageBox.call("Plugin Message", _msg, FORMAT)
  206.       end
  207.       if hresult == MessageBox::YES
  208.         catch(:loop) {
  209.           @@download[[*key]].each_with_index { |__download__, n|
  210.             __download__ = __download__.sub(/\r|\n/, "")
  211.             if __download__.include?("[PICTURE]")
  212.               __download__ = __download__.sub("[PICTURE]", "")
  213.               download(__download__, key, "./Graphics/", true)
  214.             elsif __download__.include?("[AUDIO]")
  215.               __download__ = __download__.sub("[AUDIO]", "")
  216.               download(__download__, key, "./Audio/", true)
  217.             elsif __download__.include?("[SYSTEM]")
  218.               __download__ = __download__.sub("[SYSTEM]", "")
  219.               download(__download__, key, "./System/", true)
  220.             elsif __download__.include?("[MOVIE]")
  221.               __download__ = __download__.sub("[MOVIE]", "")
  222.               download(__download__, key, "./Movies/", true)
  223.             elsif __download__.include?("[PROJECT]")
  224.               __download__ = __download__.sub("[PROJECT]", "")
  225.               download(__download__, key, "./", true)
  226.             elsif __download__.include?("[ROOTPATH]")
  227.               __download__ = __download__.sub("[ROOTPATH]", "")
  228.               download(__download__, key, "./Data/Plugins/", false, true)
  229.             else
  230.               download(__download__, key)
  231.             end
  232.           }
  233.           throw(:loop)
  234.         }
  235.       end
  236.       @@register[[*key]][:version] = version
  237.       File.delete(temp)
  238.       save_register
  239.     }
  240.   end
  241.   #----------------------------------------------------------------------------
  242.   # • Verificar erros
  243.   #----------------------------------------------------------------------------
  244.   def error_(hash)
  245.     return unless hash.is_a?(Hash)
  246.     raise("Error Plugin Register : name not defined") if hash[:name].nil?
  247.     raise("Error Plugin Register : author not defined") if hash[:author].nil?
  248.     raise("Error Plugin Register : version not defined") if hash[:version].nil?
  249.     raise("Error Plugin Register : link not defined") if hash[:link].nil?
  250.   end
  251.   #----------------------------------------------------------------------------
  252.   # • Baixar
  253.   #----------------------------------------------------------------------------
  254.   def download(content, key, dir="./Data/Plugins/", noexec=false, rootpath=false)
  255.     @check_exit = true
  256.     data = content.split(/<>/)
  257.     path = dir
  258.     unless data[2].nil?
  259.       path << data[2]
  260.       path << "/" unless data[2].include?("/")
  261.     end
  262.     Dir.mkdir(path) unless FileTest.directory?(path)
  263.     _name = data[1]
  264.     Network.link_download(data[0], path + _name)
  265.     sleep(0.1)
  266.     if rootpath
  267.       @@root_path[[*key]] = path + _name
  268.     elsif @@root_path[[*key]].is_a?(Array)
  269.       @@root_path[[*key]] << path + _name unless noexec
  270.     end
  271.   end
  272.   #----------------------------------------------------------------------------
  273.   # • Salvar configuração dos registro.
  274.   #----------------------------------------------------------------------------
  275.   def save_register
  276.     File.open("#{Dir.pwd}/Data/register.rvdata2", "wb") { |file|
  277.       export = -> {
  278.         content = {}
  279.         content[:register] = @@register
  280.         content[:root_path] = @@root_path
  281.         content
  282.       }
  283.       Marshal.dump(export.call, file)
  284.     }
  285.   end
  286.   #----------------------------------------------------------------------------
  287.   # • Carregar registro.
  288.   #----------------------------------------------------------------------------
  289.   def load_register
  290.     File.open("#{Dir.pwd}/Data/register.rvdata2", "rb") { |file|
  291.       import = ->(content) {
  292.         @@register.merge!(content[:register]) rescue {}
  293.         @@root_path.merge!(content[:root_path]) rescue {}
  294.       }
  295.       import[Marshal.load(file)]
  296.     }
  297.   end
  298. end
  299. #==========================================================================
  300. # • Insira aqui: Os Registros dos plugin.
  301. #==========================================================================
  302.  
  303. Plugin.register({
  304.    name:         :hello_world,
  305.    author:       "dax",
  306.    version:      0.0,
  307.    link:         "http://pastebin.com/raw.php?i=iAkNjUm1"
  308. })
  309.  
  310. #==========================================================================
  311. # • Não mexa aqui.
  312. #==========================================================================
  313. $ROOT_PATH = ->(filename, dir="") { "#{Dir.pwd}/Data/Plugins/#{dir}#{filename}" }
  314. Plugin.run
  315. Plugin.load_all
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement