Add update reminder (#49)

Co-authored-by: Maksym <Maksym48@pm.me>
Co-authored-by: ubulem <berkut87@gmail.com>
master
luk3yx 2022-08-02 19:48:01 +12:00 committed by GitHub
parent 0fed6077fe
commit fb78a8a0cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 241 additions and 2 deletions

View File

@ -20,6 +20,9 @@ set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
# Change to false for releases
set(DEVELOPMENT_BUILD FALSE)
set(ENABLE_UPDATE_CHECKER (NOT ${DEVELOPMENT_BUILD}) CACHE BOOL
"Whether to enable update checks by default")
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
if(VERSION_EXTRA)
set(VERSION_STRING ${VERSION_STRING}-${VERSION_EXTRA})

View File

@ -223,6 +223,7 @@ General options and their default values:
ENABLE_SYSTEM_JSONCPP=OFF - Use JsonCPP from system
OPENGL_GL_PREFERENCE=LEGACY - Linux client build only; See CMake Policy CMP0072 for reference
RUN_IN_PLACE=FALSE - Create a portable install (worlds, settings etc. in current directory)
ENABLE_UPDATE_CHECKER=TRUE - Whether to enable update checks by default
USE_GPROF=FALSE - Enable profiling using GProf
VERSION_EXTRA= - Text to append to version (e.g. VERSION_EXTRA=foobar -> MultiCraft 0.4.9-foobar)
ENABLE_TOUCH=FALSE - Enable Touchscreen support (requires support by IrrlichtMt)

View File

@ -5,6 +5,7 @@ project.ext.set("versionMinor", 0) // Version Minor
project.ext.set("versionPatch", 1) // Version Patch
project.ext.set("versionExtra", "") // Version Extra
project.ext.set("versionCode", 100) // Android Version Code
project.ext.set("developmentBuild", 0) // Whether it is a development build, or a release
// NOTE: +2 after each release!
// +1 for ARM and +1 for ARM64 APK's, because
// each APK must have a larger `versionCode` than the previous

View File

@ -15,7 +15,8 @@ android {
"versionMajor=${versionMajor}",
"versionMinor=${versionMinor}",
"versionPatch=${versionPatch}",
"versionExtra=${versionExtra}"
"versionExtra=${versionExtra}",
"developmentBuild=${developmentBuild}"
}
}
}

View File

@ -87,6 +87,7 @@ LOCAL_CFLAGS += \
-DVERSION_MINOR=${versionMinor} \
-DVERSION_PATCH=${versionPatch} \
-DVERSION_EXTRA=${versionExtra} \
-DDEVELOPMENT_BUILD=${developmentBuild} \
$(GPROF_DEF)
ifdef NDEBUG

View File

@ -2224,10 +2224,12 @@
"USE_LEVELDB=1",
"USE_LUAJIT=1",
"USE_SYSTEM_GMP=0",
"ENABLE_UPDATE_CHECKER=1",
"VERSION_MAJOR=2",
"VERSION_MINOR=0",
"VERSION_PATCH=1",
"VERSION_EXTRA=\"\"",
"DEVELOPMENT_BUILD=1",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
@ -2286,10 +2288,12 @@
"USE_LEVELDB=1",
"USE_LUAJIT=1",
"USE_SYSTEM_GMP=0",
"ENABLE_UPDATE_CHECKER=1",
"VERSION_MAJOR=2",
"VERSION_MINOR=0",
"VERSION_PATCH=1",
"VERSION_EXTRA=\"\"",
"DEVELOPMENT_BUILD=0",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",

View File

@ -0,0 +1,198 @@
--[[
Minetest
Copyright (C) 2018-2020 SmallJoker, 2022 rubenwardy
Copyright (C) 2022 MultiCraft Development Team
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3.0 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
]]
if not core.get_http_api then
function check_new_version()
end
return
end
local esc = core.formspec_escape
local defaulttexturedir = esc(defaulttexturedir)
local LANG = core.settings:get("language")
if not (LANG and (LANG ~= "")) then LANG = os.getenv("LANG") end
if not (LANG and (LANG ~= "")) then LANG = "en" end
local function version_info_formspec(data)
local changes = data.changes
-- Hack to work around https://github.com/minetest/minetest/issues/11727
if changes:sub(2, 2) == " " then
local idx = changes:find("\n", 3, true) or #changes + 1
changes = "\194\160" .. changes:sub(1, idx - 1) .. "\194\160" ..
changes:sub(idx)
end
changes = changes:gsub("\\n", "\n")
return ([[
style_type[image_button;content_offset=0]
image[4.9,0;2.5,2.5;%s]
image_button[1,2;10,0.8;%s;;%s;false;false]
hypertext[1.3,2.6;10,2;;<center>%s</center>]
style[version_check_remind;bgcolor=yellow]
button[2,4.5;4,0.8;version_check_remind;%s]
style[version_check_visit;bgcolor=green]
button[6,4.5;4,0.8;version_check_visit;%s]
]]):format(
defaulttexturedir .. "logo.png",
defaulttexturedir .. "blank.png",
esc(data.title),
esc(changes),
fgettext("Cancel"),
fgettext("Update")
) -- "Remind me later", "Update now"
end
local function version_info_buttonhandler(this, fields)
if fields.version_check_remind then
-- Erase last known, user will be reminded again at next check
core.settings:remove("update_last_known")
this:delete()
return true
end
-- if fields.version_check_never then
-- core.settings:set("update_last_checked", "disabled")
-- this:delete()
-- return true
-- end
if fields.version_check_visit then
if type(this.data.url) == "string" then
core.open_url(this.data.url)
end
-- this:delete()
-- return true
end
return false
end
local function create_version_info_dlg(title, changes, url)
assert(type(title) == "string")
assert(type(changes) == "string")
assert(type(url) == "string")
local retval = dialog_create("version_info",
version_info_formspec,
version_info_buttonhandler,
nil, true)
retval.data.title = title
retval.data.changes = changes
retval.data.url = url
return retval
end
local function get_version_code(version_string)
-- Format: Major.Minor.Patch
-- Convert to MMMNNNPPP
local ver_major, ver_minor, ver_patch = version_string:match("^(%d+).(%d+).(%d+)")
if not ver_patch then
core.log("error", "Failed to parse version numbers (invalid tag format?)")
return
end
return (ver_major * 1000 + ver_minor) * 1000 + ver_patch
end
local function on_version_info_received(update_info)
local maintab = ui.find_by_name("maintab")
if maintab.hidden then
-- Another dialog is open, abort.
return
end
local known_update = tonumber(core.settings:get("update_last_known")) or 0
-- Parse the latest version number
local new_number = get_version_code(update_info.latest_version or "")
if not new_number then
core.log("error", "dlg_version_info.lua: Failed to read version number")
return
end
-- Compare with the current number
local client_version = core.get_version()
local cur_number = get_version_code(client_version.string)
if not cur_number or new_number <= known_update or new_number < cur_number then
return
end
-- Also consider updating from 1.2.3-dev to 1.2.3
if new_number == cur_number and not client_version.is_dev then
return
end
-- core.settings:set("update_last_known", tostring(new_number))
-- Show version info dialog (once)
maintab:hide()
local url = update_info.url or "https://multicraft.world/downloads"
if not url:find("://", 1, true) then
url = "https://" .. url
end
local version_info_dlg = create_version_info_dlg(update_info.title or "", update_info.changes or "", url)
version_info_dlg:set_parent(maintab)
version_info_dlg:show()
ui.update()
end
function check_new_version()
local url = core.settings:get("update_information_url")
if core.settings:get("update_last_checked") == "disabled" or
url == "" then
-- Never show any updates
return
end
local time_now = os.time()
-- local time_checked = tonumber(core.settings:get("update_last_checked")) or 0
-- if time_now - time_checked < 2 * 24 * 3600 then
-- -- Check interval of 2 entire days
-- return
-- end
core.settings:set("update_last_checked", tostring(time_now))
url = ("%s?lang=%s&platform=%s"):format(url, LANG, PLATFORM)
core.handle_async(function(params)
local http = core.get_http_api()
return http.fetch_sync(params)
end, { url = url }, function(result)
local json = result.succeeded and core.parse_json(result.data)
if type(json) ~= "table" then
core.log("error", "Failed to read JSON output from " .. url ..
", status code = " .. result.code)
return
elseif not json.latest_version then
-- No platform-specific update information, don't display anything
return
end
on_version_info_received(json)
end)
end

View File

@ -51,6 +51,8 @@ if not mobile then
dofile(menupath .. DIR_DELIM .. "dlg_settings_advanced.lua")
end
dofile(menupath .. DIR_DELIM .. "dlg_version_info.lua")
local tabs = {}
if not mobile then
@ -148,8 +150,9 @@ function menudata.init_tabs()
end
ui.set_default("maintab")
tv_main:show()
check_new_version()
tv_main:show()
ui.update()
end

View File

@ -998,6 +998,19 @@ client_mapblock_limit (Mapblock limit) int 7500
# Whether to show the client debug info (has the same effect as hitting F5).
show_debug (Show debug info) bool false
# URL to JSON file which provides information about the newest MultiCraft release
update_information_url (Update information URL) string https://updates.multicraft.world/app.json
# Unix timestamp (integer) of when the client last checked for an update
# Set this value to "all" to never check for updates.
update_last_checked (Last update check) string
# Version number which was last seen during an update check.
#
# Representation: MMMIIIPPP, where M=Major, I=Minor, P=Patch
# Ex: 5.5.0 is 005005000
update_last_known (Last known version update) int 0
[Server / Singleplayer]
# Name of the server, to be displayed when players join and in the serverlist.

View File

@ -4558,6 +4558,7 @@ Utilities
* `string`: Simple version, eg, "1.2.3-dev"
* `hash`: Full git version (only set if available),
eg, "1.2.3-dev-01234567-dirty".
* `is_dev`: Boolean value indicating whether it's a development build
Use this for informational purposes only. The information in the returned
table does not represent the capabilities of the engine, nor is it
reliable or verifiable. Compatible forks will have a different name and

View File

@ -15,6 +15,8 @@
#define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
#define ICON_DIR "@ICONDIR@"
#cmakedefine01 RUN_IN_PLACE
#cmakedefine01 DEVELOPMENT_BUILD
#cmakedefine01 ENABLE_UPDATE_CHECKER
#cmakedefine01 USE_GETTEXT
#cmakedefine01 USE_CURL
#cmakedefine01 USE_SOUND

View File

@ -15,6 +15,7 @@
#define PROJECT_NAME "multicraft"
#define PROJECT_NAME_C "MultiCraft"
#define STATIC_SHAREDIR ""
#define ENABLE_UPDATE_CHECKER 1
#define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) STR(VERSION_EXTRA)
#ifdef NDEBUG
#define BUILD_TYPE "Release"

View File

@ -372,6 +372,12 @@ void set_default_settings()
settings->setDefault("contentdb_flag_blacklist", "nonfree, desktop_default");
#endif
settings->setDefault("update_information_url", "https://updates.multicraft.world/app.json");
#if ENABLE_UPDATE_CHECKER
settings->setDefault("update_last_checked", "");
#else
settings->setDefault("update_last_checked", "disabled");
#endif
// Server
settings->setDefault("compat_player_model", "character.b3d,3d_armor_character.b3d,skinsdb_3d_armor_character_5.b3d");

View File

@ -454,6 +454,8 @@ int ModApiUtil::l_get_version(lua_State *L)
lua_setfield(L, table, "hash");
}
lua_pushboolean(L, DEVELOPMENT_BUILD);
lua_setfield(L, table, "is_dev");
return 1;
}

View File

@ -26,6 +26,7 @@ perform_release() {
sed -i -re "s/^set\(DEVELOPMENT_BUILD TRUE\)$/set(DEVELOPMENT_BUILD FALSE)/" CMakeLists.txt
sed -i 's/project.ext.set("versionExtra", "-dev")/project.ext.set("versionExtra", "")/' build/android/build.gradle
sed -i 's/project.ext.set("developmentBuild", 1)/project.ext.set("developmentBuild", 0)/' android/build.gradle
sed -i -re "s/\"versionCode\", [0-9]+/\"versionCode\", $NEW_ANDROID_VERSION_CODE/" build/android/build.gradle
sed -i '/\<release/s/\(version\)="[^"]*"/\1="'"$RELEASE_VERSION"'"/' misc/net.minetest.minetest.appdata.xml
@ -55,6 +56,7 @@ back_to_devel() {
# Update Android versions
sed -i 's/set("versionExtra", "")/set("versionExtra", "-dev")/' build/android/build.gradle
sed -i 's/project.ext.set("developmentBuild", 0)/project.ext.set("developmentBuild", 1)/' android/build.gradle
sed -i -re "s/set\(\"versionMajor\", [0-9]+\)/set(\"versionMajor\", $NEXT_VERSION_MAJOR)/" build/android/build.gradle
sed -i -re "s/set\(\"versionMinor\", [0-9]+\)/set(\"versionMinor\", $NEXT_VERSION_MINOR)/" build/android/build.gradle
sed -i -re "s/set\(\"versionPatch\", [0-9]+\)/set(\"versionPatch\", $NEXT_VERSION_PATCH)/" build/android/build.gradle