diff --git a/install-discord-linux.rb b/install-discord-linux.rb new file mode 100755 index 0000000..a8a6c62 --- /dev/null +++ b/install-discord-linux.rb @@ -0,0 +1,212 @@ +#!/usr/bin/env ruby + +# BEGIN: Includes & Requires + +require 'erb' +require 'json' +require 'net/http' +require 'English' +require 'rubygems/package' +require 'fileutils' +require 'optparse' + +# END: Includes & Requires + + + + + +# BEGIN: Overrides + +class Dir + def / (path) + output_path = File.absolute_path(self.path) + '/' + path + if File.directory? output_path + Dir.new(output_path) + else + output_path + end + end +end + +class String + def / (other) + self + '/' + other + end +end + +# END: Overrides + + + +# BEGIN: Variables +URL_DOWNLOAD_BASE='https://dl.discordapp.net/apps/linux/{VERSION}/discord-{VERSION}.tar.gz' +DOWNLOAD_URL='https://discord.com/api/download/stable?platform=linux&format=tar.gz' + +$CONFIG = Hash.new +$CONFIG[:icon_dir] = Dir.new(Dir.home) / '.local' / 'share' / 'icons' +File.mkdir($CONFIG[:icon_dir]) if not File.exist?($CONFIG[:icon_dir]) +$CONFIG[:local_application_install_dir] = Dir.new(Dir.home) / '.local' / 'share' / 'applications' +File.mkdir($CONFIG[:local_application_install_dir]) if not File.exist?($CONFIG[:local_application_install_dir]) +$CONFIG[:desktop_path] = Dir.new(Dir.home) / '.local' / 'share' / 'applications' / 'discord.desktop' +$CONFIG[:install_dir] = Dir.new(Dir.home) / '.opt' +File.mkdir($CONFIG[:install_dir]) if not File.exist?($CONFIG[:install_dir]) +$CONFIG[:discord_path] = $CONFIG[:install_dir] / 'Discord' +$CONFIG[:desktop_file_path] = $CONFIG[:discord_path] / 'discord.desktop' +$CONFIG[:discord_version_file] = $CONFIG[:discord_path] / 'resources' / 'build_info.json' +$CONFIG[:action] = 'install' +$CONFIG[:keep_installer] = false +DISCORD_DESKTOP_CONTENTS=<\d+\.\d+\.\d+).tar.gz/ + Gem::Version.new($LAST_MATCH_INFO['version']) + else + raise "Failed to retrieve remote version" + end +end + +def get_local_version + if File.exist? $CONFIG[:discord_version_file] + data = JSON.load_file($CONFIG[:discord_version_file]) + Gem::Version.new(data['version']) + else + Gem::Version.new('0.0.0') + end +end + +def download_installer(version) + uri = URI(URL_DOWNLOAD_BASE.gsub('{VERSION}', version.to_s)) + puts "download_installer: Downloading The discord #{version.to_s} tar.gz" + file_contents = Net::HTTP.get(uri) + output_file = "discord-#{version}.tar.gz" + puts "download_installer: Output file will #{output_file}" + $CONFIG[:install_dir].chdir do + File.open(output_file, 'wb') do |file| + file.write(file_contents) + end + end + puts "download_installer: tar.gz was downloaded" +end + +def do_install(version) + installer_file = "discord-#{version}.tar.gz" + puts "do_install: Extracting new installer" + $CONFIG[:install_dir].chdir do + File.open(installer_file, 'rb') do |file| + Gem::Package.new("").extract_tar_gz(file, $CONFIG[:install_dir]) + end + end + + if not $CONFIG[:keep_installer] + puts "do_install: Removing new installer (#{installer_file})" + File.unlink(installer_file) + end +end + +def update_desktop_file + file_needs_updating = true + puts "update_desktop_file: Checking if desktop entry needs updating" + if File.exist?($CONFIG[:desktop_path]) + puts "update_desktop_file: Desktop file exists, checking if it matches template" + File.open($CONFIG[:desktop_path], 'r') do |file| + if file.read() == DISCORD_DESKTOP_CONTENTS + puts "update_desktop_file: Desktop file matches template. Not updating" + file_needs_updating = false + end + end + end + + if file_needs_updating + File.open($CONFIG[:desktop_path], 'w') do |file| + puts "update_desktop_file: Desktop File was written" + file.write(DISCORD_DESKTOP_CONTENTS) + end + + puts "update_desktop_file: Triggering desktop to install new desktop entry and refresh entries" + %x[ desktop-file-install --dir=#{$CONFIG[:local_application_install_dir].path} #{$CONFIG[:desktop_path]} ] + end +end + +# END: Helper Functions + + + +# BEGIN: Work + +local_version = get_local_version +remote_version = get_remote_version + +case $CONFIG[:action] + when 'install' + if local_version < remote_version + puts "main: Installed Version will be updated" + download_installer(remote_version) + do_install(remote_version) + elsif local_version == remote_version + puts "main: Installed Version is up-to-date" + else + puts "main: What?" + end + when 'check' + puts + puts " Report" + puts "-------------------------------------" + puts " Remote Version: #{remote_version.to_s}" + puts " Local Version: #{local_version.to_s}" + puts " Needs Updating: #{(remote_version > local_version) ? "Yes" : "No"}" +end + +# END: Work